天天看點

雲客Drupal源碼分析之網站維護模式

當drupal的網站需要更新、導入内容、備份、更改内容類型等等會影響通路使用者的時候需要開啟維護模式,操作路徑是:管理-配置-開發-維護模式

開啟維護模式并輸入提示内容即可,在提示内容中@site可以代表目前站點的名稱,除此外沒有其他變量

那麼維護模式是怎麼實作的呢?這就是本篇的主題:

判斷維護模式的工作是在處理核心派發kernel.request事件的時候進行的,優先級低于路由判斷,也就是說此時已經知道請求所對應的路由線路是什麼,系統已經解析出了請求對應的路由對象(也可以了解成路由線路)。

關于處理維護模式,系統設定了兩個偵聽器,他們的服務id分别是:

user_maintenance_mode_subscriber:

優先級:31,對應的類:Drupal\user\EventSubscriber\MaintenanceModeSubscriber 處理方法:onKernelRequestMaintenance

maintenance_mode_subscriber:

優先級:30,對應的類:Drupal\Core\EventSubscriber\MaintenanceModeSubscriber 處理方法:onKernelRequestMaintenance

先介紹一下維護模式服務對象:

在\core\lib\Drupal\Core\Site中有一個維護模式服務對象,它實作維護模式接口,這個接口隻有兩個方法:

public function applies(RouteMatchInterface $route_match); 傳回目前請求是否需要運用維護模式

public function exempt(AccountInterface $account); 判斷使用者是否可以在開啟維護模式時進行通路

MaintenanceMode是這個接口的預設實作,實作很簡單,判斷是否運用維護模式主要由兩點:

一看系統是否開啟維護模式,二看目前請求對應的路由對象是否可以在維護模式中通路

那麼定義一個路由對象的時候如何讓它即使處于維護模式還能讓使用者通路呢?隻需要設定路由對象的選項即可,如下:

yunke.content:
  path: '/yunkehello'
  defaults:
    _controller: '\Drupal\yunke\Controller\HelloController::content'
    _title: 'Hello World!!!'
  requirements:
    _permission: 'access content'
 options:  
   _maintenance_access: TRUE
           

隻要具備_maintenance_access: TRUE這個選項的路由線路,那麼即便在維護模式下也是可以通路的,登陸頁面即是如此

沒有這個選項時,判斷使用者是否能在維護模式中繼續通路,就是檢查使用者是否配置了'access site in maintenance mode'權限,此權限可以在背景使用者角色權限中配置

從優先級看出user_maintenance_mode_subscriber先執行,它做什麼呢?

它将在開啟維護模式的情況下,将已經登入的沒有維護模式繼續通路特權的使用者登出,并轉向首頁,此時成為匿名使用者

然後執行maintenance_mode_subscriber服務:

它是處理維護模式的真正服務,首先檢查路由線路是否要運用維護模式,如果是,則進而檢查使用者有無繼續通路的特權,不管什麼情況在維護模式下頁面均是禁止緩存的,通過\Drupal::service('page_cache_kill_switch')->trigger();來實作。

無特權将直接顯示維護提示頁面給出503狀态提示

如果有特權将在頁面頂部顯示“操作處于維護模式中”

在代碼分析中有兩點需要注意:

RouteMatch::createFromRequest($request);是通過之前的路由解析操作在請求中設定的參數來得到路由對象,并不需要再次解析路由

設定維護模式的頁面模闆drupal_maintenance_theme();這個函數定義位于:\core\includes\theme.maintenance.inc中

從這個函數中可以知道站點配置檔案可以指定維護模式的模闆,也可以學習到一般子產品如果指定特殊的模闆,關于模闆的使用不在本主題中

以上就是drupal維護模式的全部了

我是雲客,【雲遊天下,做客四方】,聯系方式見首頁,歡迎轉載,但須注明出處

繼續閱讀