【问题标题】:Redirect to Another Symfony Route from FilterControllerEvent Listener从 FilterControllerEvent 监听器重定向到另一个 Symfony 路由
【发布时间】:2017-03-18 22:06:13
【问题描述】:

我正在尝试设置一个 kernal.controller 侦听器以在函数返回 true 时重定向到另一个路由。我有可用的路由,但无法使用 $event->setController() 从该路由设置控制器。

我收到以下错误:

FilterControllerEvent.php 第 59 行中的 FatalThrowableError: 类型错误:传递给 Symfony\Component\HttpKernel\Event\FilterControllerEvent::setController() 的参数 1 必须是可调用的,给定字符串

有人对我如何完成这项工作有建议吗?

class BlockListener
{
    public function onKernelController(FilterControllerEvent $event)
    {
        $block = $this->blockService->checkForBlock($user->getId());

        if ($block instanceof Block) {
            // $block-getRoute() is a standard Symfony route string. It doesn't work!
            $event->setController($block->getRoute());
        }
    }
}

【问题讨论】:

  • 答案非常令人费解。正如问题所暗示的那样,您是否尝试进行实际重定向?或者只是想设置一个不同的控制器?如果你想做一个实际的重定向,那么你需要监听允许返回重定向响应的内核请求事件。文档有很多例子。

标签: php symfony redirect listener


【解决方案1】:

我们能够通过使用 Lambda 函数使其工作。感谢您的帮助!

    if ($block instanceof Block) {
        $redirectUrl = $this->router->generate($block->getRoute());
        $event->setController(function() use ($redirectUrl) {
            return new RedirectResponse($redirectUrl);
        });
    };

【讨论】:

    【解决方案2】:

    您可以根据需要修改以下选项。

    选项 1

    Full details

    听众

    namespace Application\BackendBundle\EventListener;
    
    use Symfony\Bundle\FrameworkBundle\Routing\Router;
    use Symfony\Component\HttpFoundation\RedirectResponse;
    use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
    use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
    class KernelExceptionListener
    {
        private $router;
        private $redirectRouter = 'application_frontend_default_index';
    
        public function __construct(Router $router)
        {
            $this->router = $router;
        }
    
        public function onKernelException(GetResponseForExceptionEvent $event)
        {
            $exception = $event->getException();
    
            if ($exception instanceof NotFoundHttpException) {
                if ($event->getRequest()->get('_route') == $this->redirectRouter) {
                    return;
                }
    
                $url = $this->router->generate($this->redirectRouter);
                $response = new RedirectResponse($url);
                $event->setResponse($response);
            }
        }
    }
    

    服务定义

    services:
        application_backend.event_listener.kernel_exception:
            class: Application\BackendBundle\EventListener\KernelExceptionListener
            arguments: [@router]
            tags:
                - { name: kernel.event_listener, event: kernel.exception, method: onKernelException }
    

    选项 2

    Full details

    听众

    namespace Application\FrontendBundle\Listener;
    
    use Symfony\Component\HttpFoundation\Response;
    use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
    
    class PlayerListener
    {
        public function onKernelController(FilterControllerEvent $event)
        {
            $message = 'Bye inanzzz';
    
            $event->setController(
                function() use ($message) {
                    return new Response($message, 400);
                }
            );
        }
    }
    

    服务定义

    services:
        application_frontend.listener.player:
            class: Application\FrontendBundle\Listener\PlayerListener
            tags:
                - { name: kernel.event_listener, event: kernel.controller, method: onKernelController }
    

    【讨论】:

      【解决方案3】:

      试试这个:

      $event->setController( $event->getController() );
      

      我认为它应该有效,但不能保证。 这将传入控制器而不是字符串,这就是您的错误所指示的。

      【讨论】:

      • 为什么这会做任何事情呢?用原控制器更换控制器?
      • @Cerad,它基于我 read here in Symfony's documentation 关于它的内容。 OP 在同样的事情上做得很好,除了有一个 if 语句。 setController 函数需要传入 controller 引用而不是字符串,我认为这应该可以解决问题,除非 OP 具​​有其他需要的功能。
      • 控制器事件使您有机会更改已选择的控制器。将控制器设置为已设置为有效的任何值均无济于事。问题本身措辞不佳。试图“从这条路线设置控制器”没有什么意义。
      猜你喜欢
      • 2017-10-12
      • 1970-01-01
      • 2017-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-09
      • 2013-11-10
      • 1970-01-01
      相关资源
      最近更新 更多