从KernelEvents :: CONTROLLER订阅者

时间:2017-05-17 09:28:01

标签: php symfony symfony-2.8

我正在使用这种模式实现控制器过滤器:

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
        }
    }
}

2 个答案:

答案 0 :(得分:2)

如果您想要出于任何特定原因操纵响应,您可以执行类似下面的操作,具有一些通用逻辑。你需要实现你想用它做的任何其他事情。

如果您在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 }

LISTENER

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);
            }
        );
    }

....

答案 1 :(得分:1)

kernel.controller 的这个级别,你无法操纵响应(为此你需要 kernel.response ,你需要使用 setResponse < / strong>方法 - 但是你无法验证控制器类型)。 如果你真的需要控制器类型,在这种情况下你可以做的是用任何可调用的方式更改控制器:

$('#IdThatOnlyExistsOnSubPage2').someMethod(...)

希望这能回答你的问题。