我正在学习Symfony,在我的示例项目中,我有一个注销监听器来观察注销。
如何实现重定向或在这种情况下转发到另一条路由?
class LogoutListener implements LogoutHandlerInterface {
protected $userManager;
public function logout(Request $request, Response $response, TokenInterface $token) {
$request->getSession()->invalidate();
$this-> ....?
}
}
答案 0 :(得分:2)
LogoutHandlerInterface
不能用于注销后修改行为。
请改用LogoutSuccessHandlerInterface
,尤其是onLogoutSuccess方法。
使用此方法来自定义注销行为并返回RedirectResponse。
例如:
class LogoutListener implements LogoutSuccessHandlerInterface
{
public function onLogoutSuccess(Request $request): Response
{
$request->getSession()->invalidate();
return new RedirectResponse('http://mycoolsite.com');
}
}
或者甚至更好地使用路由器的generate method为您的路线生成一个网址。
class LogoutListener implements LogoutSuccessHandlerInterface
{
protected $router;
public function __construct(RouterInterface $router)
{
$this->router = $router;
}
public function onLogoutSuccess(Request $request): Response
{
$request->getSession()->invalidate();
return new RedirectResponse(
$this->router->generate(
'myroute',
[],
UrlGeneratorInterface::ABSOLUTE_PATH
)
);
}
}
答案 1 :(得分:0)
@kalehman
抱歉,我的回复很晚,但我生病了一段时间。
我尝试了您的示例,但我喜欢它,这似乎是更好的方法。 但是我遇到了一个我无法解决的异常。
在我的security.yaml中,我对此进行了配置:
firewalls:
main:
pattern: ^/
form_login:
provider: fos_userbundle
csrf_token_generator: security.csrf.token_manager
default_target_path: /welcome
logout:
handlers: [App\Listeners\LogoutListener]
anonymous: true
access_control:
- { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/admin/, role: ROLE_ADMIN }
我的例外:
传递给Symfony \ Component \ Security \ Http \ Firewall \ LogoutListener :: addHandler()的参数1必须实现接口Symfony \ Component \ Security \ Http \ Logout \ LogoutHandlerInterface,给定的App \ Listeners \ LogoutListener实例,在/中调用var / www / symfony / mosys-tool-collection / symfony / var / cache / dev / ContainerXfIwZpI / getSecurity_Firewall_Map_Context_MainService.php在第30行
handlers: [App\Listeners\LogoutListener]
是错误的,还是?
我还需要配置什么?