gpt4 book ai didi

php - Symfony:如何从前过滤器(监听器)返回 JSON 响应?

转载 作者:行者123 更新时间:2023-12-05 03:10:38 28 4
gpt4 key购买 nike

来自以下this example在处理任何 Controller 操作之前,我已经设法设置了下面的监听器/前过滤器来解析对我的 API 端点(即/api/v1)的所有请求。这用于验证请求类型并在不满足某些条件时抛出错误。

我想根据应用程序环境状态区分错误响应。如果我们在开发或测试中,我只是想抛出遇到的错误。或者,如果在生产模式下,我想将错误作为 JSON 响应返回。这可能吗?如果没有,我怎么能做类似的事情?

我正在使用 Symfony v3.1.*,如果这有什么不同的话。

namespace AppBundle\EventListener;

use AppBundle\Interfaces\ApiAuthenticatedController;
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;

class ApiBeforeListener
{
/**
* @var \Symfony\Component\DependencyInjection\ContainerInterface
*/
protected $container;

public function __construct(ContainerInterface $container)
{
$this->container = $container;
}

/**
* Validates a request for API resources before serving content
*
* @param \Symfony\Component\HttpKernel\Event\FilterControllerEvent $event
* @return mixed
*/
public function onKernelController(FilterControllerEvent $event)
{
$controller = $event->getController();

if (!is_array($controller))
return;

if ($controller[0] instanceof ApiAuthenticatedController) {

$headers = $event->getRequest()->headers->all();

// only accept ajax requests
if(!isset($headers['x-requested-with'][0]) || strtolower($headers['x-requested-with'][0]) != 'xmlhttprequest') {

$error = new AccessDeniedHttpException('Unsupported request type.');

if (in_array($this->container->getParameter("kernel.environment"), ['dev', 'test'], true)) {
throw $error;
} else {
// return json response here for production environment
//
// For example:
//
// header('Content-Type: application/json');
//
// return json_encode([
// 'code' => $error->getCode(),
// 'status' => 'error',
// 'message' => $error->getMessage()
// ]);
}
}
}
}

}

最佳答案

与大多数事件不同,FilterControllerEvent 不允许您返回响应对象。如果确实如此,那就太好了,但是哦,好吧。

您有两个基本选择。

最好的方法是简单地抛出一个异常,然后添加一个异常监听器。然后,异常监听器可以根据环境返回 JsonResponse。

创建一个只返回 JsonResponse 的 Controller 的另一种可能性,然后使用 $event->setController($jsonErrorController) 指向它。

但我认为抛出异常可能是您最好的选择。

此处有更多详细信息:http://symfony.com/doc/current/reference/events.html

关于php - Symfony:如何从前过滤器(监听器)返回 JSON 响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39155354/

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