重定向表单LogoutListener

时间:2018-09-23 13:30:17

标签: php symfony routing symfony4

我正在学习Symfony,在我的示例项目中,我有一个注销监听器来观察注销。

如何实现重定向或在这种情况下转发到另一条路由?

class LogoutListener implements LogoutHandlerInterface {

    protected $userManager;

    public function logout(Request $request, Response $response, TokenInterface $token) {
        $request->getSession()->invalidate();
        $this->  ....?
    }
}

2 个答案:

答案 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]是错误的,还是? 我还需要配置什么?