Перенаправить форму LogoutListener - PullRequest
       20

Перенаправить форму LogoutListener

0 голосов
/ 23 сентября 2018

Я изучаю Symfony, и в моем примере проекта у меня есть слушатель выхода из системы, который наблюдает за выходом из системы.

Как реализовать перенаправление или в этом случае переадресацию на другой маршрут?

class LogoutListener implements LogoutHandlerInterface {

    protected $userManager;

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

Ответы [ 2 ]

0 голосов
/ 29 сентября 2018

@ 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 }

Мое исключение:

Аргумент 1переданный Symfony \ Component \ Security \ Http \ Firewall \ LogoutListener :: addHandler () должен реализовать интерфейс 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] не так, или?Что еще мне нужно настроить?

0 голосов
/ 23 сентября 2018

LogoutHandlerInterface не предназначен для изменения поведения после выхода из системы.

Взгляните на LogoutSuccessHandlerInterface, особенно на onLogoutSuccess метод.

Используйте этот метод для настройки поведения выхода из системы и возврата RedirectResponse .

Например:

class LogoutListener implements LogoutSuccessHandlerInterface 
{
    public function onLogoutSuccess(Request $request): Response
    {
        $request->getSession()->invalidate();

        return new RedirectResponse('http://mycoolsite.com');
    }
}

Или даже лучше использовать метод генерации маршрутизатора, чтобы сгенерировать URL для вашего маршрута.

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