Как зарегистрировать пользователя из приложения Symfony 2 с помощью внутренних обработчиков

Symfony реализует функции регистрации пользователей и уничтожения файлов cookie. Существует LogoutListener который делегирует эти действия нескольким обработчикам выхода: CookieClearingLogoutHandler и SessionLogoutHandler .

Если мы хотим вручную вывести пользователя из приложения, я считаю, что лучшим способом было бы назвать эти обработчики, а не реализовывать (дублировать) такую ​​низкоуровневую логику самостоятельно.

Можно ли это сделать?

Вы можете реализовать расширенный регистратор-выход, переопределив службу security.logout_listener по умолчанию.

Метод LogoutListener::requiresLogin(...) умолчанию проверяет только, является ли путь запроса равным параметру logout_path брандмауэра.

Это выглядит так:

 protected function requiresLogout(Request $request) { return $this->httpUtils->checkRequestPath( $request, $this->options['logout_path'] ); } 

Предположим теперь, что вы хотите выполнить выход из системы, если для параметра logout session-parameter установлено значение true .

Поэтому мы расширяем класс LogoutListener и добавляем наш собственный метод LogoutListener requiresLogout() с дополнительной логикой.

 namespace Your\Name\Space; use Symfony\Component\Security\Http\Firewall\LogoutListener; use Symfony\Component\HttpFoundation\Session\SessionInterface; class MyLogoutListener extends LogoutListener { /** * Whether this request is asking for logout. * * @param Request $request * * @return Boolean */ protected function requiresLogout(Request $request) { if ( $request->getSession()->get('logout') ) { return true; } return parent::requiresLogout($request); } 

После этого мы просто переопределяем параметр container.logout_listener.class с нашим пользовательским классом в нашем config.yml .

 parameters: security.logout_listener.class: \Your\Name\Space\MyLogoutListener 

Теперь вы можете выйти из системы внутри ...Controller :

  public function someAction(Request $request) { // ... some logic here if ($condition) { $request->getSession()->set('logout', true); } }