2013-03-18 5 views
1

Я работаю с Symfony 2.1. Я хочу настроить процедуру переадресации в зависимости от входа пользователя в систему или нет. Я проверяю это $User->isLoggedIn(), где User - это услуга.Перенаправление на различные действия в зависимости от состояния пользователя

Я хочу сделать это до того, как контроллер выполнит. У меня мало других вещей, которые происходят непосредственно перед выполнением Controller. Я использую событие: kernel.controller из kernel.event_listener, чтобы сделать это. Но я понял, что я не могу перенаправить URL-адрес с помощью этого события.

Я понимаю, что мне нужно использовать событие: kernel.request kernel.event_listener, чтобы иметь возможность перенаправлять URL-адрес.

Проблема. Я использую следующую логику, чтобы выяснить, нужно ли мне перенаправлять или нет.

if (!$controller[0] instanceof NoLogInNeededInterface) { 

    if (!$User->isLoggedIn()) { 
     //redirect here 
    } 
} 

Так, в kernel.request случае, $controler[0] не доступен. В событии kernel.controller ответ не может быть установлен (будет проигнорирован).

У кого-то такая же проблема и решена. Или есть лучший способ сделать то, что я пытаюсь сделать?

+0

в качестве боковой подсказки: если вы начинаете с нового проекта, используйте Symfony2.2. Symfony 2.0 больше не поддерживается –

+0

Спасибо. Фактически получили 2,1. Я отредактирую. – Webghost

ответ

1

Я понял, что то, что я хотел, могло быть достигнуто с помощью kernel.exception event kernel.event_listner.

Так Услуги:

my.service: 
    class: MyBundle\EventListner\ExceptionListner 
     tags: 
      - { name: kernel.event_listener, event: kernel.exception, method: onKernelException } 
     arguments: [ %logoutUrl% ] 

Тогда в самом классе:

use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent; 
use Symfony\Component\HttpFoundation\RedirectResponse; 

class ExceptionListner 
{ 
    protected $_url; 

    public function __construct($url) 
    { 
     $this->_url = $url; 
    } 

    public function onKernelException(GetResponseForExceptionEvent $event) { 
     $exception = $event->getException(); 
     //dont necessarily need this condition 
     if ($exception instanceof RedirectException) { 
      $response = new RedirectResponse($this->_url); 
      $event->setResponse($response); 
     } 
    } 

} 

Я до сих пор на предложение, если это или не лучший подход. Надеюсь, это поможет и тем, кто борется. P

Смежные вопросы