2012-10-16 46 views
26

Tôi có một thiết lập lắng nghe sự kiện hạt nhân (kernel.controller) để chuyển hướng người dùng nếu hes không đăng nhập. Trình nghe sự kiện được gọi một cách thành công, tuy nhiên, tôi gặp khó khăn trong việc tìm cách chuyển hướng. Đây là những gì tôi đã nhận:Chuyển hướng Symfony2 cho trình xử lý sự kiện?

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

nào mang lại cho tôi những lỗi:

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

Trả lời

41

Bạn không thể đặt một phản ứng với một đối tượng FilterControllerEvent. Bạn cần phải lắng nghe cho sự kiện kernel.request vì đối tượng GetResponseEvent nó có setResponse() phương pháp:

$route = 'route_name'; 

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

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

Oh thú vị. Im vẫn nhận được 'call to undefined method setResponse', có một lớp/tập tin nào mà tôi nên đưa vào không? –

+0

Bạn đã thay đổi loại tham số thành 'GetResponseEvent' chưa? Và bạn có thực sự lắng nghe 'kernel.request' không? Vui lòng kiểm tra lại nó. –

+0

Ok hóa ra tôi đã trên kernal.controller, vì vậy tôi chuyển nó kernal.request và nó chuyển hướng với lỗi 'ErrorException: Catchable Fatal Error: Argument 1 được truyền đến ... phải là một thể hiện của Symfony \ Component \ HttpKernel \ Event \ FilterControllerEvent, instance của Symfony \ Component \ HttpKernel \ Event \ GetResponseEvent' –

4

More quặng cách ít rõ ràng để chuyển hướng vào 'kernel.controller' sự kiện

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

Nó không hoạt động đối với sản phẩm env symfony2.1. -1. – NHG

81

Nếu bạn muốn chuyển hướng từ FilterControllerEvent bạn nên sử dụng cái này:

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

Đây chính xác là những gì tôi đang tìm kiếm, cảm ơn! Tôi cần phải chuyển hướng trong các điều kiện nhất định, một trong số đó là khi một bộ điều khiển cụ thể được định tuyến. Sự kiện onKernelRequest được gọi trước khi nó thực sự định tuyến bộ điều khiển để tôi không thể đặt logic ở đó. – Bryson

+0

Mẹo thông minh! Cám ơn. – Damien

+0

điều này vừa lưu cuộc đời của tôi – RedactedProfile

-5

Đây không phải là không có cách nào để đi, bạn tôi. Bạn nên sử dụng một Symfony Security mặc định để trang trải cho bạn ...

Các vấn đề liên quan