【问题标题】:Return a response from KernelEvents::CONTROLLER subscriber从 KernelEvents::CONTROLLER 订阅者返回响应
【发布时间】:2017-05-17 09:28:01
【问题描述】:

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

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

【问题讨论】:

  • 不懂,return $response 是回复。或创建另一个回复return new Response('No authorized')

标签: php symfony symfony-2.8


【解决方案1】:

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

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

....

【讨论】:

    【解决方案2】:

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

    $replacementController = new ReplacementController();
    $event->setController($replacementController->getReplacementMethod());
    

    希望这能回答您的问题。

    【讨论】:

      猜你喜欢
      • 2022-10-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-28
      相关资源
      最近更新 更多