1

我正在尝试在我的 symfony2 应用程序中登录后实现重定向,以便在我的用户是否具有一个属性时进行重定向。我在我的项目的 Handler 文件夹中创建了类 AuthenticationSuccessHandler.php :

    命名空间 Me\MyBundle\Handler;

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


    类 AuthenticationSuccessHandler 扩展 DefaultAuthenticationSuccessHandler {

        公共函数__construct(HttpUtils $httpUtils,数组$options){
            父::__construct($httpUtils, $options);
        }

        公共函数 onAuthenticationSuccess( 请求 $request, TokenInterface $token ) {


        $user = $token->getUser();

        if($user->getProfile()!=1){
            $url = 'fos_user_profile_edit';
        }别的{
            $url = '我的路线';
        }

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

但是当我登录时,我得到一个错误:

注意:未定义的属性:/var/www/MyBundle/src/Me/MyBundle/Handler/AuthenticationSuccessHandler.php 第 28 行中的 Me\MyBundle\Handler\AuthenticationSuccessHandler::$router

错误发生在“return new RedirectResponse($this->router->generate($url));”中

我也有我的服务:

    my_auth_success_handler:
            类:我\MyBundle\Handler\AuthenticationSuccessHandler
            公开:假
            参数:[@security.http_utils,[]]

和 security.yml 中的成功处理程序:

    fos_facebook:
            成功处理程序:my_auth_success_handler

有任何想法吗?非常感谢。

4

2 回答 2

3

您没有@router注入服务。修改你的构造函数

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

和服务定义:

...
arguments: [ @security.http_utils, [], @router ]
于 2013-11-13T18:38:45.970 回答
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;
    }

请注意,默认值 "$options = []" 对于 AutowirePass 很重要:否则,将引发异常。但是你有一个空数组。

进入 services.yml:

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

无需在此处指定参数;-)

于 2017-06-13T21:38:58.133 回答