使用FOSUserBundle成功登录和注销后添加flash消息和重定向



使用Symfony 2.8和FOSUSerBundle 2.0,我试图:

  1. 根据用户角色在登录和注销后重定向,
  2. 为每个操作添加自定义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);
    }
}

最新更新