Php 从KerneleEvents::CONTROLLER订阅服务器返回响应
我正在使用以下模式实现控制器过滤器: 但是,我想返回一个响应,而不是抛出HTTP异常 我该怎么做?SF2中最好/最可接受的方式是什么Php 从KerneleEvents::CONTROLLER订阅服务器返回响应,php,symfony,symfony-2.8,Php,Symfony,Symfony 2.8,我正在使用以下模式实现控制器过滤器: 但是,我想返回一个响应,而不是抛出HTTP异常 我该怎么做?SF2中最好/最可接受的方式是什么 public function onKernelController(FilterControllerEvent $event) { if (!$event->isMasterRequest()) { return; } $controller = $event->getController();
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
}
}
}
在kernel.controller的这个级别上,您无法操纵响应(为此,您需要kernel.response,并且需要使用setResponse方法 -但您无法验证控制器类型)。 如果您确实需要控制器类型,在这种情况下,您可以使用任何可调用的命令更改控制器:
$replacementController = new ReplacementController();
$event->setController($replacementController->getReplacementMethod());
希望这能回答您的问题。如果您想出于任何给定的原因操纵响应,您可以执行以下类似操作,其中包含一些通用逻辑。你需要实现你想用它做的任何事情 如果您在站点中查找
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);
}
);
}
....
不明白,
return$response
是一个响应。或者创建另一个响应返回新响应(“未授权”)