PHP   发布时间:2022-04-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了php – symfony 3控制器中的自定义注释大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
所以问题非常简单.我的控制器中的代码已经变得冗余,我决定为它做一个注释.
if (!$request->getContentType() === 'json' ) {
        return new JsonResponse(array('success' => falsE));
    }
    $content = $request->getContent();

    if(empty($content)){
        throw new BadrequesthttpException("Content is empty");
    }
    $data = json_decode($content,truE);
    if(empty($data) || !array_key_exists('type',$data)) {
        return new JsonResponse(array('success' => falsE));
    }

如何制作自定义注释@checkrequest,我可以使用$request对象作为参数?

解决方法

您需要创建一个自定义注释,然后是一个注入注释阅读器并处理kernel.controller事件的侦听器:

注解

/**
 * @Annotation
 */
class checkrequest
{
}

服务定义

services:
    controller_check_request:
        class: AppBundle\EventListener\ControllercheckrequestListener
        tags:
            - { name: kernel.event_listener,event: kernel.controller,method: onKernelController}
        arguments:
            - "@Annotation_reader"

监听器:

namespace AppBundle\EventListener;

use AppBundle\Annotation\checkrequest;
use Doctrine\Common\Annotations\Reader;
use Symfony\Component\httpFoundation\JsonResponse;
use Symfony\Component\httpKernel\Event\FilterControllerEvent;
use Symfony\Component\httpKernel\Exception\BadrequesthttpException;

class ControllercheckrequestListener
{
    /** @var Reader */
    private $reader;

    /**
     * @param Reader $reader
     */
    public function __construct(Reader $reader)
    {
        $this->reader = $reader;
    }

    /**
     * {@inheritdoc}
     */
    public function onKernelController(FilterControllerEvent $event)
    {
        if (!is_array($controllers = $event->getController())) {
            return;
        }

        $request = $event->getrequest();
        $content = $request->getContent();

        list($controller,$methodName) = $controllers;

        $reflectionClass = new \ReflectionClass($controller);
        $classAnnotation = $this->reader
            ->getClassAnnotation($reflectionClass,checkrequest::class);

        $reflectionObject = new \ReflectionObject($controller);
        $reflectionMethod = $reflectionObject->getMethod($methodName);
        $methodAnnotation = $this->reader
            ->getMethodAnnotation($reflectionMethod,checkrequest::class);

        if (!($classAnnotation || $methodAnnotation)) {
            return;
        }

        if ($request->getContentType() !== 'json' ) {
            return $event->setController(
                function() {
                    return new JsonResponse(['success' => false]);
                }
            );
        }

        if (empty($content)) {
            throw new BadrequesthttpException('Content is empty');
        }

        $data = json_decode($content,truE);

        if ($request->getContentType() !== 'json' ) {
            return $event->setController(
                function() {
                    return new JsonResponse(['success' => false]);
                }
            );
        }
    }
}

请注意,不是返回响应,而是使用$event-> setController();设置整个控制器,并且在进行该调用时也必须返回.

然后在您的控制器中,您可以在整个类中设置它:

use AppBundle\Annotation\checkrequest;

/**
 * @checkrequest
 */
class YourController extends Controller
{
}

或个别方法/行动:

use AppBundle\Annotation\checkrequest;

class TESTController extends Controller
{
    /**
     * @Route("/",name="index")
     * @checkrequest
     */
    public function indexAction(request $request)
    {
        // ...
    }
}

大佬总结

以上是大佬教程为你收集整理的php – symfony 3控制器中的自定义注释全部内容,希望文章能够帮你解决php – symfony 3控制器中的自定义注释所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。