annotate core/lib/Drupal/Core/EventSubscriber/MaintenanceModeSubscriber.php @ 19:fa3358dc1485 tip

Add ndrum files
author Chris Cannam
date Wed, 28 Aug 2019 13:14:47 +0100
parents 129ea1e6d783
children
rev   line source
Chris@0 1 <?php
Chris@0 2
Chris@0 3 namespace Drupal\Core\EventSubscriber;
Chris@0 4
Chris@17 5 use Drupal\Component\Render\FormattableMarkup;
Chris@0 6 use Drupal\Core\Config\ConfigFactoryInterface;
Chris@0 7 use Drupal\Core\Render\BareHtmlPageRendererInterface;
Chris@14 8 use Drupal\Core\Messenger\MessengerInterface;
Chris@0 9 use Drupal\Core\Routing\RouteMatch;
Chris@0 10 use Drupal\Core\Routing\UrlGeneratorInterface;
Chris@0 11 use Drupal\Core\Session\AccountInterface;
Chris@0 12 use Drupal\Core\Site\MaintenanceModeInterface;
Chris@0 13 use Drupal\Core\StringTranslation\StringTranslationTrait;
Chris@0 14 use Drupal\Core\StringTranslation\TranslationInterface;
Chris@0 15 use Symfony\Component\EventDispatcher\EventSubscriberInterface;
Chris@0 16 use Symfony\Component\HttpFoundation\Response;
Chris@0 17 use Symfony\Component\HttpKernel\Event\GetResponseEvent;
Chris@0 18 use Symfony\Component\HttpKernel\KernelEvents;
Chris@0 19
Chris@0 20 /**
Chris@0 21 * Maintenance mode subscriber for controller requests.
Chris@0 22 */
Chris@0 23 class MaintenanceModeSubscriber implements EventSubscriberInterface {
Chris@0 24
Chris@0 25 use StringTranslationTrait;
Chris@0 26
Chris@0 27 /**
Chris@0 28 * The maintenance mode.
Chris@0 29 *
Chris@0 30 * @var \Drupal\Core\Site\MaintenanceModeInterface
Chris@0 31 */
Chris@0 32 protected $maintenanceMode;
Chris@0 33
Chris@0 34 /**
Chris@0 35 * The current account.
Chris@0 36 *
Chris@0 37 * @var \Drupal\Core\Session\AccountInterface
Chris@0 38 */
Chris@0 39 protected $account;
Chris@0 40
Chris@0 41 /**
Chris@0 42 * The config factory.
Chris@0 43 *
Chris@0 44 * @var \Drupal\Core\Config\ConfigFactoryInterface
Chris@0 45 */
Chris@0 46 protected $config;
Chris@0 47
Chris@0 48 /**
Chris@0 49 * The url generator.
Chris@0 50 *
Chris@0 51 * @var \Drupal\Core\Routing\UrlGeneratorInterface
Chris@0 52 */
Chris@0 53 protected $urlGenerator;
Chris@0 54
Chris@0 55 /**
Chris@0 56 * The bare HTML page renderer.
Chris@0 57 *
Chris@0 58 * @var \Drupal\Core\Render\BareHtmlPageRendererInterface
Chris@0 59 */
Chris@0 60 protected $bareHtmlPageRenderer;
Chris@0 61
Chris@0 62 /**
Chris@14 63 * The messenger.
Chris@14 64 *
Chris@14 65 * @var \Drupal\Core\Messenger\MessengerInterface
Chris@14 66 */
Chris@14 67 protected $messenger;
Chris@14 68
Chris@14 69 /**
Chris@0 70 * Constructs a new MaintenanceModeSubscriber.
Chris@0 71 *
Chris@0 72 * @param \Drupal\Core\Site\MaintenanceModeInterface $maintenance_mode
Chris@0 73 * The maintenance mode.
Chris@0 74 * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
Chris@0 75 * The config factory.
Chris@0 76 * @param \Drupal\Core\StringTranslation\TranslationInterface $translation
Chris@0 77 * The string translation.
Chris@0 78 * @param \Drupal\Core\Routing\UrlGeneratorInterface $url_generator
Chris@0 79 * The url generator.
Chris@0 80 * @param \Drupal\Core\Session\AccountInterface $account
Chris@0 81 * The current user.
Chris@0 82 * @param \Drupal\Core\Render\BareHtmlPageRendererInterface $bare_html_page_renderer
Chris@0 83 * The bare HTML page renderer.
Chris@14 84 * @param \Drupal\Core\Messenger\MessengerInterface $messenger
Chris@14 85 * The messenger.
Chris@0 86 */
Chris@14 87 public function __construct(MaintenanceModeInterface $maintenance_mode, ConfigFactoryInterface $config_factory, TranslationInterface $translation, UrlGeneratorInterface $url_generator, AccountInterface $account, BareHtmlPageRendererInterface $bare_html_page_renderer, MessengerInterface $messenger) {
Chris@0 88 $this->maintenanceMode = $maintenance_mode;
Chris@0 89 $this->config = $config_factory;
Chris@0 90 $this->stringTranslation = $translation;
Chris@0 91 $this->urlGenerator = $url_generator;
Chris@0 92 $this->account = $account;
Chris@0 93 $this->bareHtmlPageRenderer = $bare_html_page_renderer;
Chris@14 94 $this->messenger = $messenger;
Chris@0 95 }
Chris@0 96
Chris@0 97 /**
Chris@0 98 * Returns the site maintenance page if the site is offline.
Chris@0 99 *
Chris@0 100 * @param \Symfony\Component\HttpKernel\Event\GetResponseEvent $event
Chris@0 101 * The event to process.
Chris@0 102 */
Chris@0 103 public function onKernelRequestMaintenance(GetResponseEvent $event) {
Chris@0 104 $request = $event->getRequest();
Chris@0 105 $route_match = RouteMatch::createFromRequest($request);
Chris@0 106 if ($this->maintenanceMode->applies($route_match)) {
Chris@0 107 // Don't cache maintenance mode pages.
Chris@0 108 \Drupal::service('page_cache_kill_switch')->trigger();
Chris@0 109
Chris@0 110 if (!$this->maintenanceMode->exempt($this->account)) {
Chris@0 111 // Deliver the 503 page if the site is in maintenance mode and the
Chris@0 112 // logged in user is not allowed to bypass it.
Chris@0 113
Chris@0 114 // If the request format is not 'html' then show default maintenance
Chris@0 115 // mode page else show a text/plain page with maintenance message.
Chris@0 116 if ($request->getRequestFormat() !== 'html') {
Chris@0 117 $response = new Response($this->getSiteMaintenanceMessage(), 503, ['Content-Type' => 'text/plain']);
Chris@0 118 $event->setResponse($response);
Chris@0 119 return;
Chris@0 120 }
Chris@0 121 drupal_maintenance_theme();
Chris@0 122 $response = $this->bareHtmlPageRenderer->renderBarePage(['#markup' => $this->getSiteMaintenanceMessage()], $this->t('Site under maintenance'), 'maintenance_page');
Chris@0 123 $response->setStatusCode(503);
Chris@0 124 $event->setResponse($response);
Chris@0 125 }
Chris@0 126 else {
Chris@0 127 // Display a message if the logged in user has access to the site in
Chris@0 128 // maintenance mode. However, suppress it on the maintenance mode
Chris@0 129 // settings page.
Chris@0 130 if ($route_match->getRouteName() != 'system.site_maintenance_mode') {
Chris@0 131 if ($this->account->hasPermission('administer site configuration')) {
Chris@14 132 $this->messenger->addMessage($this->t('Operating in maintenance mode. <a href=":url">Go online.</a>', [':url' => $this->urlGenerator->generate('system.site_maintenance_mode')]), 'status', FALSE);
Chris@0 133 }
Chris@0 134 else {
Chris@14 135 $this->messenger->addMessage($this->t('Operating in maintenance mode.'), 'status', FALSE);
Chris@0 136 }
Chris@0 137 }
Chris@0 138 }
Chris@0 139 }
Chris@0 140 }
Chris@0 141
Chris@0 142 /**
Chris@0 143 * Gets the site maintenance message.
Chris@0 144 *
Chris@0 145 * @return \Drupal\Component\Render\MarkupInterface
Chris@0 146 * The formatted site maintenance message.
Chris@0 147 */
Chris@0 148 protected function getSiteMaintenanceMessage() {
Chris@17 149 return new FormattableMarkup($this->config->get('system.maintenance')->get('message'), [
Chris@0 150 '@site' => $this->config->get('system.site')->get('name'),
Chris@0 151 ]);
Chris@0 152 }
Chris@0 153
Chris@0 154 /**
Chris@0 155 * {@inheritdoc}
Chris@0 156 */
Chris@0 157 public static function getSubscribedEvents() {
Chris@0 158 $events[KernelEvents::REQUEST][] = ['onKernelRequestMaintenance', 30];
Chris@0 159 $events[KernelEvents::EXCEPTION][] = ['onKernelRequestMaintenance'];
Chris@0 160 return $events;
Chris@0 161 }
Chris@0 162
Chris@0 163 }