我正在尝试在我的symfony2应用程序中登录后实现重定向,以便在我的用户具有一个属性时重定向。我在项目中的Handler文件夹中创建了AuthenticationSuccessHandler.php类:
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 :: $ router in /var/www/MyBundle/src/Me/MyBundle/Handler/AuthenticationSuccessHandler.php第28行
错误发生在“返回新的RedirectResponse($ this-> router-> generate($ 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
有什么想法吗?非常感谢你。
答案 0 :(得分:3)
您没有注入@router
服务。修改你的构造函数
protected $router;
public function __construct( HttpUtils $httpUtils, array $options, $router ) {
$this->router = $router;
parent::__construct( $httpUtils, $options );
}
服务定义:
...
arguments: [ @security.http_utils, [], @router ]
答案 1 :(得分: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
无需在此处指定参数; - )