我正在使用此模式实现 Controller 过滤器:
http://symfony.com/doc/current/event_dispatcher/before_after_filters.html#creating-an-event-listener
但是,我不想抛出 HTTP 异常,而是想返回响应。
我怎样才能做到这一点? SF2 中最好/最可接受的方式是什么?
public function onKernelController(FilterControllerEvent $event)
{
if (!$event->isMasterRequest()) {
return;
}
$controller = $event->getController();
// $controller passed can be either a class or a Closure.
// This is not usual in Symfony but it may happen.
// If it is a class, it comes in array format
if (!is_array($controller)) {
return;
}
if ($controller[0] instanceof ResourceServerAuthorizedController) {
$request = $event->getRequest();
$response = $this->resourceServer->authorize($request);
if (!$response->isOk()) {
return $response; // ??? HERE
}
}
}
最佳答案
如果您想出于任何给定原因操纵响应,您可以执行如下操作,其中具有一些通用逻辑。您需要实现您想用它做的任何其他事情。
如果您在 http://www.inanzzz.com/ 中查找 onKernelController
网站,您会发现 7 个使用它的示例。
services:
application_frontend.listener.player:
class: Application\FrontendBundle\Listener\PlayerListener
tags:
- { name: kernel.event_listener, event: kernel.controller, method: onKernelController }
听众
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
....
public function onKernelController(FilterControllerEvent $event)
{
if (!$event->isMasterRequest()) {
return;
}
$controller = $event->getController();
if (!is_array($controller)) {
return;
}
if (!$controller[0] instanceof YourController) {
return;
}
$message = 'Bye inanzzz';
$event->setController(
function() use ($message) {
return new Response($message, 200);
}
);
}
....
关于php - 从 KernelEvents::CONTROLLER 订阅者返回响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44020810/