我正在尝试在我的Symfony2应用程序中登录后实现重定向,以便在我的用户是否具有一个属性时进行重定向。我已经在我的项目的处理程序文件夹中创建了类 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;class AuthenticationSuccessHandler extensions DefaultAuthenticationSuccessHandler { public function __construct( HttpUtils $httpUtils, array $options ) { 父项::__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'; } 返回新的重定向响应($this->router->generate($url)); } }
但是当我登录时,我收到一个错误:
注意:未定义的属性:Me\MyBundle\Handler\AuthenticationSuccessHandler::$router in/var/www/MyBundle/src/Me/MyBundle/Handler/AuthenticationSuccessHandler.php 第 28 行
错误发生在"返回新的重定向响应($this->router->generate($url));"
我也有我的服务:
my_auth_success_handler: class: Me\MyBundle\Handler\AuthenticationSuccessHandler 公开:假 参数: [ @security.http_utils, [] ]
和 security.yml 中的成功处理程序:
fos_facebook: success_handler:my_auth_success_handler
有什么想法吗?谢谢。
您没有注入@router
服务。修改构造函数
protected $router;
public function __construct( HttpUtils $httpUtils, array $options, $router ) {
$this->router = $router;
parent::__construct( $httpUtils, $options );
}
和服务定义:
...
arguments: [ @security.http_utils, [], @router ]
使用 Symfony>= 2.8,您可以使用 AutowirePass,简化服务定义。
use SymfonyComponentRoutingRouter;
use SymfonyComponentSecurityHttpHttpUtils;
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很重要:否则,将引发异常。但是你有一个空数组。
进入服务.yml:
my_auth_success_handler:
class: MeMyBundleHandlerAuthenticationSuccessHandler
public: false
autowire: true
无需在此处指定参数;-)