2013-11-13 7 views
1

Я пытаюсь реализовать перенаправление после входа в приложение symfony2 для перенаправления, если у моего пользователя есть один атрибут или нет. Я создал класс AuthenticationSuccessHandler.php внутри обработчика папки в моем проекте:АутентификацияSuccessHandler и перенаправление после входа в систему

 

    namespace Me\MyBundle\Handler; 

    use Symfony\Component\Security\Http\HttpUtils; 
    use Symfony\Component\HttpFoundation\RedirectResponse; 
    use Symfony\Component\HttpFoundation\Request; 
    use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; 
    use Symfony\Component\Security\Http\Authentication\DefaultAuthenticationSuccessHandler; 


    class AuthenticationSuccessHandler extends DefaultAuthenticationSuccessHandler { 

     public function __construct(HttpUtils $httpUtils, array $options) { 
      parent::__construct($httpUtils, $options); 
     } 

     public function onAuthenticationSuccess(Request $request, TokenInterface $token) { 


     $user = $token->getUser(); 

     if($user->getProfile()!=1){ 
      $url = 'fos_user_profile_edit'; 
     }else{ 
      $url = 'My_route'; 
     } 

     return new RedirectResponse($this->router->generate($url)); 
     } 
    } 

Но когда я войти, я получаю сообщение об ошибке:

Примечание: Не определено свойство: Me \ MyBundle \ Handler \ AuthenticationSuccessHandler :: $ маршрутизатор /var/www/MyBundle/src/Me/MyBundle/Handler/AuthenticationSuccessHandler.php линии 28

ошибка в происходит в «возвращение новой RedirectResponse ($ this-> router-> генерировать ($ URL));»

У меня также есть сервис:

 

    my_auth_success_handler: 
      class: Me\MyBundle\Handler\AuthenticationSuccessHandler 
      public: false 
      arguments: [ @security.http_utils, [] ] 

и обработчик успеха в security.yml:

 

    fos_facebook: 
      success_handler: my_auth_success_handler 

Любые идеи? Большое спасибо.

ответ

3

У вас нет @router введенное обслуживание. Изменить ваш конструктор

protected $router; 
public function __construct(HttpUtils $httpUtils, array $options, $router) { 
    $this->router = $router; 
    parent::__construct($httpUtils, $options); 
} 

и сервис определения:

... 
arguments: [ @security.http_utils, [], @router ] 
0

С Symfony> = 2.8, то есть AutowirePass, что делает упрощение в определении сервиса.

use Symfony\Component\Routing\Router; 
use Symfony\Component\Security\Http\HttpUtils; 

class AuthenticationSuccessHandler extends DefaultAuthenticationSuccessHandler 
{ 

    /** 
    * @var Router 
    */ 
    protected $router; 

    public function __construct(HttpUtils $httpUtils, array $options = [], Router $router) 
    { 
     parent::__construct($httpUtils, $options); 
     $this->router = $router; 
    } 

Обратите внимание, что значение по умолчанию «$ опция = []» имеет важное значение для AutowirePass: без этого, исключение будет выброшено. Но у вас есть пустой массив.

в services.yml:

my_auth_success_handler: 
     class: Me\MyBundle\Handler\AuthenticationSuccessHandler 
     public: false 
     autowire: true 

Нет необходимости указывать аргументы здесь ;-)

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