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