The key codes I list as follow:
config/autoload/global.php
return [
'db' => [
'driver' => 'Pdo',
'dsn' => 'mysql:dbname=discourse;host=localhost;charset=utf8mb4',
],
'validators' => [
'delegators' => [
Laminas\Validator\Db\RecordExists::class => [
Laminas\Db\Adapter\AdapterServiceDelegator::class,
],
],
],
];
module/Application/src/Form/ForumRewardForm.php
<?php
/**
* forum_reward对应的表单模型
*/
namespace Application\Form;
use Laminas\Filter\StringTrim;
use Laminas\Filter\StripTags;
use Laminas\Filter\ToInt;
use Laminas\Form\Element\Hidden;
use Laminas\Form\Form;
use Laminas\InputFilter\InputFilterProviderInterface;
use Laminas\Validator\Between;
use Laminas\Validator\Db\RecordExists;
use Laminas\Validator\InArray;
use Laminas\Validator\Ip;
use Laminas\Validator\NotEmpty;
use Laminas\Validator\Callback;
class ForumRewardForm extends Form implements InputFilterProviderInterface
{
public function init() : void
{
$this->add([
'name' => 'id',
'type' => Hidden::class,
]);
$this->add([
'name' => 'fromuid', //打赏的uid
'type' => Hidden::class,
]);
$this->add([
'name' => 'touid', //被打赏人的uid
'type' => Hidden::class,
]);
$this->add([
'name' => 'targettype', //1对帖子打赏
'type' => Hidden::class,
]);
$this->add([
'name' => 'targetid', //目标的id,例如帖子的id
'type' => Hidden::class,
]);
$this->add([
'name' => 'rewardtype', //1打赏的是金币
'type' => Hidden::class,
]);
$this->add([
'name' => 'rewardnum', //打赏的数量,比如10金币
'type' => Hidden::class,
]);
$this->add([
'name' => 'ip', //打赏的人的ip
'type' => Hidden::class,
]);
$this->add([
'name' => 'addtime', //添加时间戳
'type' => Hidden::class,
]);
}
public function getInputFilterSpecification() : array
{
return [
[
'name' => 'id',
'required' => true,
'filters' => [
['name' => ToInt::class],
],
'validators' => [
[
'name' => NotEmpty::class,
'options' => ['message' => 'id不能为空'],
],
],
],
[
'name' => 'fromuid', //打赏的uid
'required' => true,
'filters' => [
['name' => ToInt::class],
],
'validators' => [
[
'name' => NotEmpty::class,
'options' => ['message' => 'fromuid不能为空'],
],
],
],
[
'name' => 'touid', //被打赏人的uid
'required' => true,
'filters' => [
['name' => ToInt::class],
],
'validators' => [
[
'name' => NotEmpty::class,
'options' => ['message' => 'touid不能为空'],
],
],
],
[
'name' => 'targettype', //1对帖子打赏
'required' => true,
'filters' => [
['name' => ToInt::class],
],
'validators' => [
[
'name' => NotEmpty::class,
'options' => ['message' => 'targettype不能为空'],
],
[
'name' => InArray::class,
'options' => [
'haystack' => [1,2],
'message' => 'type只能是1或者2'
],
]
],
],
[
'name' => 'targetid', //目标的id,例如帖子的id
'required' => true,
'filters' => [
['name' => ToInt::class],
],
'validators' => [
[
'name' => Callback::class,
'options' => [
'callback' => function($value, $context){
if ((int)($context['targettype']) == 1)
{
$validatorChain = $this->getInputFilter()->get('targetid')->getValidatorChain();
$validatorChain->attachByName(RecordExists::class,[
'table' => 'thread_main',
'field' => 'id',
'message' => '帖子不存在',
]);
$this->getInputFilter()->get('targetid')->setValidatorChain($validatorChain);
return false;
}
return true;
},
'message' => 'target有问题',
],
],
],
],
[
'name' => 'rewardtype', //1打赏的是金币
'required' => true,
'filters' => [
['name' => ToInt::class],
],
'validators' => [
[
'name' => NotEmpty::class,
'options' => ['message' => 'rewardtype不能为空'],
],
[
'name' => InArray::class,
'options' => [
'haystack' => [1,2],
'message' => 'way只能是1或者2'
],
]
],
],
[
'name' => 'rewardnum', //打赏的数量,比如10金币
'required' => true,
'filters' => [
['name' => ToInt::class],
],
'validators' => [
[
'name' => NotEmpty::class,
'options' => ['message' => 'rewardnum不能为空'],
],
[
'name' => Between::class,
'options' => [
'min' => 0,
'max' => 10000,
'inclusive' => false,
'message' => '打赏数量0-9999',
],
]
],
],
[
'name' => 'ip', //打赏的人的ip
'required' => true,
'filters' => [
['name' => StripTags::class],
['name' => StringTrim::class],
],
'validators' => [
[
'name' => NotEmpty::class,
'options' => ['message' => 'ip不能为空'],
],
[
'name' => Ip::class,
'options' => [
'allowipv6' => false,
'message' => '不支持ipv6'
],
],
],
],
[
'name' => 'addtime', //添加时间戳
'required' => true,
'filters' => [
['name' => ToInt::class],
],
'validators' => [
[
'name' => NotEmpty::class,
'options' => ['message' => 'addtime不能为空'],
],
],
],
];
}
}
module/Applicaiton/src/Controller/RewardController.php
<?php
/**
* forum_reward 相关的控制器
*/
namespace Application\Controller;
use Application\Controller\Plugin\AuthPlugin;
use Application\Controller\Plugin\ThreadPlugin;
use Application\Form\ForumRewardForm;
use Application\Model\BaseFuncModel;
use Application\Model\ForumReward;
use Application\Model\ForumRewardTable;
use Laminas\Form\FormElementManager;
use Laminas\Mvc\Controller\AbstractActionController;
use Laminas\View\Model\JsonModel;
class RewardController extends AbstractActionController
{
protected $baseFuncModel;
protected $forumRewardTable;
protected $formElementManager;
/** DI */
public function __construct(BaseFuncModel $baseFuncModel, ForumRewardTable $forumRewardTable, FormElementManager $formElementManager)
{
$this->baseFuncModel = $baseFuncModel;
$this->forumRewardTable = $forumRewardTable;
$this->formElementManager = $formElementManager;
}
public function rewardingAction()
{
$request = $this->getRequest();
/** @var AuthPlugin $authPlugin */
$authPlugin = $this->plugin('auth');
$identityArr = $authPlugin->getIdentity($request);
$ip = $this->baseFuncModel->getIp($request);
if (!$ip) return new JsonModel([
'status' => false,
'msg' => '获取不到ip',
'code' => 111,
'data' => null,
]);
$muteArr = $authPlugin->getMute([$identityArr['uid']]);
if (isset($muteArr[$identityArr['uid']]) && $muteArr[$identityArr['uid']]) return new JsonModel([
'status' => false,
'msg' => '你已经被封禁',
'code' => 111,
'data' => null,
]);
$frequencyAllow = $this->baseFuncModel->frequencyForbidden($identityArr['uid'],'rewarding',$ip);
if (!$frequencyAllow) return new JsonModel([
'status' => false,
'msg' => '频率太高',
'code' => 111,
'data' => null,
]);
$targettype = (int) $request->getQuery('type', 1); //先强行按照只能打赏帖子,且只能打赏金币来处理
$targetid = (int) $request->getQuery('target', 0);
$rewardtype = (int) $request->getQuery('way', 1);
$rewardnum = (int) $request->getQuery('amount', 0);
$getArr = compact('targettype', 'targetid', 'rewardtype', 'rewardnum', 'ip');
$form = $this->formElementManager->get(ForumRewardForm::class);
$form->setValidationGroup('targettype', 'targetid','rewardtype', 'rewardnum', 'ip');
$form->setData($getArr);
if (!$form->isValid()) return new JsonModel([
'status' => false,
'msg' => $this->baseFuncModel->formErrorOneByOne($form->getMessages()),
'code' => 111,
'data' => null,
]);
/** @var ThreadPlugin $threadPlugin */
$threadPlugin = $this->plugin('thread');
$threadStatic = $threadPlugin->threadDetailStatic($targetid);
$threadStatic = current($threadStatic);
$forumReward = new ForumReward();
$forumReward->exchangeArray($form->getData());
$result = $this->forumRewardTable->save($forumReward, $identityArr, $threadStatic);
return new JsonModel([
'status' => $result['status'],
'msg' => $result['msg'],
'code' => 111,
'data' => null,
]);
}
}
Any other codes needed for you to figure out the problem?