annotate core/lib/Drupal/Core/EventSubscriber/MaintenanceModeSubscriber.php @ 12:7a779792577d

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