Loading redirect_after_logout.module +0 −25 Original line number Diff line number Diff line Loading @@ -22,31 +22,6 @@ function redirect_after_logout_help($route_name, RouteMatchInterface $route_matc } } /** * Implements hook_page_attachments(). */ function redirect_after_logout_page_attachments(array &$attachments) { $parameter_bag = \Drupal::request()->query; // Set logout message. if ((bool) $parameter_bag->get('logout-message') && \Drupal::currentUser()->isAnonymous()) { $config = \Drupal::config('redirect_after_logout.settings'); $logout_message = $config->get('message'); $token_service = \Drupal::token(); \Drupal::messenger()->addMessage(Xss::filter($token_service->replace($logout_message))); } elseif ((bool) $parameter_bag->get('logout-message') && !\Drupal::currentUser()->isAnonymous()) { $destination = \Drupal::service('redirect.destination')->getAsArray(); $current_url = Url::fromRoute('<current>'); $path = $current_url->getInternalPath(); $path_args = explode('/', $path); if ($path_args !== FALSE) { $destination = implode('/', $path_args); } $response = new RedirectResponse($destination); $response->send(); } } /** * Implements hook_user_logout(). */ Loading redirect_after_logout.services.yml +7 −1 Original line number Diff line number Diff line services: redirect_after_logout_subscriber: class: 'Drupal\redirect_after_logout\EventSubscriber\RedirectAfterLogoutSubscriber' arguments: ['@config.factory'] arguments: - '@config.factory' - '@current_user' - '@messenger' - '@redirect.destination' - '@request_stack' - '@token' tags: - { name: 'event_subscriber' } src/EventSubscriber/RedirectAfterLogoutSubscriber.php +95 −2 Original line number Diff line number Diff line Loading @@ -3,10 +3,17 @@ namespace Drupal\redirect_after_logout\EventSubscriber; use Drupal\Component\Utility\UrlHelper; use Drupal\Component\Utility\Xss; use Drupal\Core\Config\ConfigFactory; use Drupal\Core\Messenger\MessengerInterface; use Drupal\Core\Routing\RedirectDestinationInterface; use Drupal\Core\Session\AccountProxyInterface; use Drupal\Core\Url; use Drupal\Core\Utility\Token; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\HttpFoundation\RedirectResponse; use Symfony\Component\HttpFoundation\RequestStack; use Symfony\Component\HttpKernel\Event\RequestEvent; use Symfony\Component\HttpKernel\Event\ResponseEvent; use Symfony\Component\HttpKernel\KernelEvents; Loading @@ -25,10 +32,68 @@ class RedirectAfterLogoutSubscriber implements EventSubscriberInterface { protected $configFactory; /** * {@inheritdoc} * The current user. * * @var \Drupal\Core\Session\AccountProxyInterface */ protected $currentUser; /** * The messenger. * * @var \Drupal\Core\Messenger\MessengerInterface */ protected $messenger; /** * The redirect destination. * * @var \Drupal\Core\Routing\RedirectDestinationInterface */ protected $redirectDestination; /** * The request stack. * * @var \Symfony\Component\HttpFoundation\RequestStack */ protected $requestStack; /** * The token service. * * @var \Drupal\Core\Utility\Token */ protected $token; /** * Constructor. * * @param \Drupal\Core\Config\ConfigFactory * The config factory. * @param \Drupal\Core\Session\AccountProxyInterface * The current user. * @param \Drupal\Core\Messenger\MessengerInterface $messenger * The messenger. * @param RedirectDestinationInterface $redirectDestination * The redirect destination. * @param \Symfony\Component\HttpFoundation\RequestStack $request_stack * The request stack. * @param \Drupal\Core\Utility\Token $token * The token service. */ public function __construct(ConfigFactory $configFactory) { public function __construct(ConfigFactory $configFactory, AccountProxyInterface $currentUser, MessengerInterface $messenger, RedirectDestinationInterface $redirectDestination, RequestStack $request_stack, Token $token) { $this->configFactory = $configFactory; $this->currentUser = $currentUser; $this->messenger = $messenger; $this->redirectDestination = $redirectDestination; $this->requestStack = $request_stack; $this->token = $token; } /** Loading Loading @@ -69,12 +134,40 @@ class RedirectAfterLogoutSubscriber implements EventSubscriberInterface { $response->send(); } /** * Check redirection. * * @param \Symfony\Component\HttpKernel\Event\ResponseEvent $event * Event. */ public function showMessage(RequestEvent $event) { $parameter_bag = $this->requestStack->getCurrentRequest()->query; // Set logout message. if ((bool) $parameter_bag->get('logout-message') && $this->currentUser->isAnonymous()) { $config = $this->configFactory->get('redirect_after_logout.settings'); $logout_message = $config->get('message'); $this->messenger->addMessage(Xss::filter($this->token->replace($logout_message))); } elseif ((bool) $parameter_bag->get('logout-message') && !$this->currentUser->isAnonymous()) { $destination = $this->redirectDestination->getAsArray(); $current_url = Url::fromRoute('<current>'); $path = $current_url->getInternalPath(); $path_args = explode('/', $path); if ($path_args !== FALSE) { $destination = implode('/', $path_args); } $response = new RedirectResponse($destination); $response->send(); } } /** * {@inheritdoc} */ public static function getSubscribedEvents() { $events = []; $events[KernelEvents::RESPONSE][] = ['checkRedirection']; $events[KernelEvents::REQUEST][] = ['showMessage', 50]; return $events; } Loading tests/src/Functional/RedirectTest.php +0 −3 Original line number Diff line number Diff line Loading @@ -41,9 +41,6 @@ class RedirectTest extends TestBase { // Valid node path. $this->setRedirectConfig('/foobar-example', $message); $this->logoutRedirectHelper($this->regularUser, '/foobar-example', $message); // Path only token. $this->setRedirectConfig('[current-user:url]', $message); $this->logoutRedirectHelper($this->regularUser, $this->regularUser->toUrl()->toString(), $message); // Path with token. $this->setRedirectConfig('/foobar-[site:name]', $message); $this->logoutRedirectHelper($this->regularUser, '/foobar-example', $message); Loading Loading
redirect_after_logout.module +0 −25 Original line number Diff line number Diff line Loading @@ -22,31 +22,6 @@ function redirect_after_logout_help($route_name, RouteMatchInterface $route_matc } } /** * Implements hook_page_attachments(). */ function redirect_after_logout_page_attachments(array &$attachments) { $parameter_bag = \Drupal::request()->query; // Set logout message. if ((bool) $parameter_bag->get('logout-message') && \Drupal::currentUser()->isAnonymous()) { $config = \Drupal::config('redirect_after_logout.settings'); $logout_message = $config->get('message'); $token_service = \Drupal::token(); \Drupal::messenger()->addMessage(Xss::filter($token_service->replace($logout_message))); } elseif ((bool) $parameter_bag->get('logout-message') && !\Drupal::currentUser()->isAnonymous()) { $destination = \Drupal::service('redirect.destination')->getAsArray(); $current_url = Url::fromRoute('<current>'); $path = $current_url->getInternalPath(); $path_args = explode('/', $path); if ($path_args !== FALSE) { $destination = implode('/', $path_args); } $response = new RedirectResponse($destination); $response->send(); } } /** * Implements hook_user_logout(). */ Loading
redirect_after_logout.services.yml +7 −1 Original line number Diff line number Diff line services: redirect_after_logout_subscriber: class: 'Drupal\redirect_after_logout\EventSubscriber\RedirectAfterLogoutSubscriber' arguments: ['@config.factory'] arguments: - '@config.factory' - '@current_user' - '@messenger' - '@redirect.destination' - '@request_stack' - '@token' tags: - { name: 'event_subscriber' }
src/EventSubscriber/RedirectAfterLogoutSubscriber.php +95 −2 Original line number Diff line number Diff line Loading @@ -3,10 +3,17 @@ namespace Drupal\redirect_after_logout\EventSubscriber; use Drupal\Component\Utility\UrlHelper; use Drupal\Component\Utility\Xss; use Drupal\Core\Config\ConfigFactory; use Drupal\Core\Messenger\MessengerInterface; use Drupal\Core\Routing\RedirectDestinationInterface; use Drupal\Core\Session\AccountProxyInterface; use Drupal\Core\Url; use Drupal\Core\Utility\Token; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\HttpFoundation\RedirectResponse; use Symfony\Component\HttpFoundation\RequestStack; use Symfony\Component\HttpKernel\Event\RequestEvent; use Symfony\Component\HttpKernel\Event\ResponseEvent; use Symfony\Component\HttpKernel\KernelEvents; Loading @@ -25,10 +32,68 @@ class RedirectAfterLogoutSubscriber implements EventSubscriberInterface { protected $configFactory; /** * {@inheritdoc} * The current user. * * @var \Drupal\Core\Session\AccountProxyInterface */ protected $currentUser; /** * The messenger. * * @var \Drupal\Core\Messenger\MessengerInterface */ protected $messenger; /** * The redirect destination. * * @var \Drupal\Core\Routing\RedirectDestinationInterface */ protected $redirectDestination; /** * The request stack. * * @var \Symfony\Component\HttpFoundation\RequestStack */ protected $requestStack; /** * The token service. * * @var \Drupal\Core\Utility\Token */ protected $token; /** * Constructor. * * @param \Drupal\Core\Config\ConfigFactory * The config factory. * @param \Drupal\Core\Session\AccountProxyInterface * The current user. * @param \Drupal\Core\Messenger\MessengerInterface $messenger * The messenger. * @param RedirectDestinationInterface $redirectDestination * The redirect destination. * @param \Symfony\Component\HttpFoundation\RequestStack $request_stack * The request stack. * @param \Drupal\Core\Utility\Token $token * The token service. */ public function __construct(ConfigFactory $configFactory) { public function __construct(ConfigFactory $configFactory, AccountProxyInterface $currentUser, MessengerInterface $messenger, RedirectDestinationInterface $redirectDestination, RequestStack $request_stack, Token $token) { $this->configFactory = $configFactory; $this->currentUser = $currentUser; $this->messenger = $messenger; $this->redirectDestination = $redirectDestination; $this->requestStack = $request_stack; $this->token = $token; } /** Loading Loading @@ -69,12 +134,40 @@ class RedirectAfterLogoutSubscriber implements EventSubscriberInterface { $response->send(); } /** * Check redirection. * * @param \Symfony\Component\HttpKernel\Event\ResponseEvent $event * Event. */ public function showMessage(RequestEvent $event) { $parameter_bag = $this->requestStack->getCurrentRequest()->query; // Set logout message. if ((bool) $parameter_bag->get('logout-message') && $this->currentUser->isAnonymous()) { $config = $this->configFactory->get('redirect_after_logout.settings'); $logout_message = $config->get('message'); $this->messenger->addMessage(Xss::filter($this->token->replace($logout_message))); } elseif ((bool) $parameter_bag->get('logout-message') && !$this->currentUser->isAnonymous()) { $destination = $this->redirectDestination->getAsArray(); $current_url = Url::fromRoute('<current>'); $path = $current_url->getInternalPath(); $path_args = explode('/', $path); if ($path_args !== FALSE) { $destination = implode('/', $path_args); } $response = new RedirectResponse($destination); $response->send(); } } /** * {@inheritdoc} */ public static function getSubscribedEvents() { $events = []; $events[KernelEvents::RESPONSE][] = ['checkRedirection']; $events[KernelEvents::REQUEST][] = ['showMessage', 50]; return $events; } Loading
tests/src/Functional/RedirectTest.php +0 −3 Original line number Diff line number Diff line Loading @@ -41,9 +41,6 @@ class RedirectTest extends TestBase { // Valid node path. $this->setRedirectConfig('/foobar-example', $message); $this->logoutRedirectHelper($this->regularUser, '/foobar-example', $message); // Path only token. $this->setRedirectConfig('[current-user:url]', $message); $this->logoutRedirectHelper($this->regularUser, $this->regularUser->toUrl()->toString(), $message); // Path with token. $this->setRedirectConfig('/foobar-[site:name]', $message); $this->logoutRedirectHelper($this->regularUser, '/foobar-example', $message); Loading