使用Symfony 2.8和FOSUSerBundle 2.0,我试图:
- 根据用户角色在登录和注销后重定向,
- 为每个操作添加自定义flash消息
我在我的安全性中添加了一个target和default_target_path参数。但是它只重定向到一个预定义的路由:
firewalls:
main:
pattern: ^/
form_login:
provider: fos_userbundle
login_path: fos_user_security_login
check_path: fos_user_security_check
csrf_token_generator: security.csrf.token_manager
default_target_path: fos_user_profile_show
always_use_default_target_path: false
logout:
path: fos_user_security_logout
target: fos_user_security_login
success_handler: app.logout_success_handler
anonymous: true
如您所见,我已经创建了一个logout_success_handler服务:
class LogoutSuccessHandler implements LogoutSuccessHandlerInterface
{
protected $router;
public function __construct(Router $router)
{
$this->router = $router;
}
public function onLogoutSuccess(Request $request)
{
$route = $this->router->generate('my_route');
return new RedirectResponse($route);
}
}
但这是一个好方法吗?如何添加flash消息?
这种服务在文件系统中的推荐位置是什么?我把LogoutSuccessHandler
在~/EventListener
目录,但我认为这不是适当的地方…你的意见是什么?
另外,我将在登录后准备一个类似的服务(重定向和flash消息)。
下面的代码可以吗?
use SymfonyComponentSecurityHttpAuthenticationAuthenticationSuccessHandlerInterface;
use SymfonyComponentSecurityCoreAuthenticationTokenTokenInterface;
use SymfonyComponentHttpFoundationRequest;
use SymfonyComponentHttpFoundationRedirectResponse;
use SymfonyBundleFrameworkBundleRoutingRouter;
use SymfonyComponentHttpFoundationSessionSession;
class LoginSuccessHandler implements AuthenticationSuccessHandlerInterface
{
protected $router;
protected $session;
public function __construct(Router $router, Session $session)
{
$this->router = $router;
$this->session = $session;
}
public function onAuthenticationSuccess(Request $request, TokenInterface $token_name(token))
{
$this->session->getFlashBag()->add('success', 'user.welcome' );
$default_route = $this->router->generate('fos_user_profile_show');
return new RedirectResponse($default_route);
}
}
这种方法是合适的。您可以通过以下方式添加flash消息。
class LogoutSuccessHandler implements LogoutSuccessHandlerInterface
{
protected $router;
protected $session;
public function __construct(Router $router, Session $session)
{
$this->router = $router;
$this->session = $session;
}
public function onLogoutSuccess(Request $request)
{
$this->session->getFlashBag()->add('success', 'user.logout');
$route = $this->router->generate('my_route');
return new RedirectResponse($route);
}
}