上海戴文 - Drupal开发 在线教育

你在这里

云客Drupal8源码分析之网站维护模式

主标签

当drupal8的网站需要升级、导入内容、备份、更改内容类型等等会影响访问用户的时候需要开启维护模式,操作路径是:管理-配置-开发-维护模式
开启维护模式并输入提示内容即可,在提示内容中@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中
从这个函数中可以知道站点配置文件可以指定维护模式的模板,也可以学习到一般模块如果指定特殊的模板,关于模板的使用不在本主题中

以上就是drupal8维护模式的全部了

 

我是云客,【云游天下,做客四方】欢迎转载,但须著名出处,讨论请加qq群203286137

 

 

Drupal 版本: 

猜你喜欢