从以下this example开始,我设法设置了下面的Listener / Before Filter,以便在处理任何控制器操作之前解析对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()
// ]);
}
}
}
}
}
答案 0 :(得分:1)
与大多数事件不同,FilterControllerEvent不允许您返回响应对象。如果它确实很好但是很好。
您有两个基本选择。
最好的方法是简单地抛出异常,然后添加异常监听器。然后,异常监听器可以根据环境返回JsonResponse。
创建仅返回JsonResponse的控制器的另一种可能性是使用$ event-> setController($ jsonErrorController)指向它。
但我认为抛出异常可能是你最好的选择。
此处有更多详情:http://symfony.com/doc/current/reference/events.html