使用 FOSUserBundle 在成功登录和注销后添加一条闪现消息并重定向
Add a flash message and redirect after successfull login and logout using FOSUserBundle
使用 Symfony 2.8 和 FOSUSerBundle 2.0,我正在尝试:
- 根据用户角色登录和注销后重定向,
- 为每个操作添加自定义闪现消息
我在 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);
}
}
使用 Symfony 2.8 和 FOSUSerBundle 2.0,我正在尝试:
- 根据用户角色登录和注销后重定向,
- 为每个操作添加自定义闪现消息
我在 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);
}
}