php 控制器中属性,php – symfony 3控制器中的自定义注释

本文介绍如何创建自定义注解`CheckRequest`来处理`kernel.controller`事件,通过注解阅读器验证控制器和方法级别的注解,确保HTTP请求的内容类型为JSON且非空。在控制器类或方法上应用此注解,可以强制执行JSON内容验证,否则返回错误响应。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

您需要创建一个自定义注释,然后是一个注入注释阅读器并处理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)

{

// ...

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值