2016-11-05 87 views
1

我試圖設置一個kernal.controller監聽器,當函數返回true時重定向到另一個路由。我有可用的路線,但沒有辦法使用$event->setController()來設置此路線的控制器。從FilterControllerEvent監聽器重定向到另一個Symfony路由

我收到以下錯誤:

FatalThrowableError in FilterControllerEvent.php line 59: Type error: Argument 1 passed to Symfony\Component\HttpKernel\Event\FilterControllerEvent::setController() must be callable, string given

有沒有人對我怎樣才能完成這個建議嗎?

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()); 
     } 
    } 
} 
+0

答案很令人費解。你想嘗試做一個真正的重定向,因爲這個問題意味着什麼?或者只是試圖設置一個不同的控制器?如果你想做一個實際的重定向,那麼你需要監聽允許返回重定向響應的內核請求事件。這些文檔有很多例子。 – Cerad

回答

0

試試這個:

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

,我認爲它應該工作,但沒有任何保證。 這通過控制器而不是字符串,這是您的錯誤表示。

+0

這爲什麼會做任何事情?用原來的控制器替換控制器? – Cerad

+0

@Cerad,它基於我[在Symfony的文檔中閱讀](http://symfony.com/doc/current/reference/events.html#kernel-controller)。 OP在做同樣的事情時表現不錯,除了有if語句之外。 setController函數需要傳遞一個'controller'引用而不是一個字符串,我認爲這應該可以解決這個問題,除非OP具有其他一些必需的功能。 –

+0

控制器事件讓您有機會更改已經選擇的控制器。將控制器設置爲已設置的任何值都無效。這個問題本身措辭不佳。試圖「從這條路線設置控制器」毫無意義。 – Cerad

1

您可以根據需要修改下面的選項。

OPTION 1

Full details

LISTENER

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

SERVICE DEFINITION

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

OPTION 2

Full details

LISTENER

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

我們可以得到它的工作通過使用Lambda功能。謝謝您的幫助!

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