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