2012-10-16 15 views
26

Mam instalator detektora zdarzeń jądra (kernel.controller), aby przekierować użytkownika, jeśli nie jest zalogowany. Odbiornik zdarzeń jest wywoływany z powodzeniem, jednak mam problem z ustaleniem sposobu przekierowania. Oto co mam:Przekierowanie Symfony2 dla detektora zdarzeń?

$cont = $event->getController('testpost'); 
$event->setResponse($cont); 

Który daje mi błąd:

Fatal error: Call to undefined method Symfony\Component\HttpKernel\Event\FilterControllerEvent::setResponse() 

Odpowiedz

41

Nie można ustawić reakcję na FilterControllerEvent obiektu. Trzeba nasłuchiwać zdarzenia kernel.request ponieważ jego GetResponseEvent obiekt posiada metodę setResponse():

$route = 'route_name'; 

if ($route === $event->getRequest()->get('_route')) { 
    return; 
} 

$url = $this->router->generate($route); 
$response = new RedirectResponse($url); 
$event->setResponse($response); 
+0

O, ciekawe. Nadal otrzymuję 'call to undefined method setResponse', jest tam klasa/plik, które powinienem zawierać? –

+0

Czy zmieniono typ parametru na "GetResponseEvent"? Czy naprawdę słuchasz 'kernel.request'? Proszę dokładnie to sprawdzić. –

+0

OK okazuje się, że byłem na kernal.controller, więc zmieniłem go na kernal.request i przekierowuje z błędem 'ErrorException: Catchable Fatal Error: Argument 1 przekazany do ... musi być instancją Symfony \ Component \ HttpKernel \ Event \ FilterControllerEvent, wystąpienie Symfony \ Component \ HttpKernel \ Event \ GetResponseEvent' –

4

Więcej rudy mniej wyraźny sposób przekierować na „kernel.controller” zdarzenie

public function onKernelController(FilterControllerEvent $event) 
{ 
    /* @var $controller \Symfony\Bundle\FrameworkBundle\Controller\Controller */ 
    $controller = $event->getController()[0]; // PHP 5.4 or $controller = $controller[0]; 

    throw new HttpException(307, null, null, array('Location' => $controller->generateUrl('homepage'))); 
} 
+0

Nie działa dla prod env symfony2.1. -1. – NHG

81

Jeśli chcesz przekierować z FilterControllerEvent należy użyć tego:

public function onKernelController(FilterControllerEvent $event) 
{ 
    // do something 
    $event->setController(function() use ($redirectUrl) { 
     return new RedirectResponse($redirectUrl); 
    }); 
} 
+0

To było dokładnie to, czego szukałem, dzięki! Musiałem przekierować pod pewnymi warunkami, z których jednym był przypadek, kiedy określony kontroler został skierowany. Zdarzenie onKernelRequest zostało wywołane przed faktycznym skierowaniem kontrolera, więc nie mogłem umieścić tam logiki. – Bryson

+0

Sprytne wskazówki! Dzięki. – Damien

+0

to właśnie uratowało mi życie – RedactedProfile

-5

To nie jest w żaden sposób iść, mój przyjacielu. Powinieneś użyć domyślnego Symfony Security, aby to ukryć ...

Powiązane problemy