gpt4 book ai didi

php - symfony 3 Controller 中的自定义注释

转载 作者:可可西里 更新时间:2023-10-31 23:14:43 25 4
gpt4 key购买 nike

所以这个问题很简单。我的 Controller 中有一段代码变得多余,我决定为其添加注释。

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 对象作为参数?

最佳答案

您需要创建一个自定义注解,然后一个监听器注入(inject)注解读取器并处理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(); 设置整个 Controller ,并且在进行该调用时还必须 return

然后在你的 Controller 中你可以在整个类上设置它:

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 Controller 中的自定义注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45617904/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com