使用 FOSUserBundle 在成功登录和注销后添加一条闪现消息并重定向

Add a flash message and redirect after successfull login and logout using FOSUserBundle

使用 Symfony 2.8 和 FOSUSerBundle 2.0,我正在尝试:

  1. 根据用户角色登录和注销后重定向,
  2. 为每个操作添加自定义闪现消息

我在 security.yml 中添加了一个目标和 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);
    }

}

但这是一个好方法吗? 如何添加即显消息?

此类服务在文件系统中的推荐位置是什么?我已经将 LogoutSuccessHandler 放在 ~/EventListener 目录中,但我认为这不是合适的位置...你有什么看法?

此外,我准备在登录后提供类似的服务(重定向和即时消息)。

下面的代码可以吗?

use Symfony\Component\Security\Http\Authentication\AuthenticationSuccessHandlerInterface;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Bundle\FrameworkBundle\Routing\Router;
use Symfony\Component\HttpFoundation\Session\Session;

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 message

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);
    }
}