Drupal 8:更改更新依赖项

我执行了很多Drupal更新,并且大多数都进行得很好。代码更新无意外,而数据库更新则可以毫不费力地应用所需的任何更新。但是,我会不时遇到一个项目,该项目已经有一段时间没有收到更新了,这意味着要运行大量数据库更新。

让Drupal在模块和核心之间运行100多个数据库更新可能会有些问题。某些模块将要求首先进行核心更新,而当此更新发生故障时,数据库更新更新将严重失败。

解决这个问题的一种方法是在模块和Drupal的版本之间进行切换,直到您有了可以工作的东西为止,但是这可能是一个相当大的挑战,并且可能会让您在执行多个部署时有潜在的停机时间,只是为了让事情保持最新。如果您维护一个贡献的模块,并且依赖于核心或模块中的更新挂钩在您的模块可以执行更新之前运行,那么这种更新情况可能会很复杂。

这些问题可以通过使用hook_update_dependencies()钩子来解决。此钩子必须放在module.install文件中,并允许您强制某些更新钩子在其他钩子之前运行。它不接受任何参数,并且必须返回模块依赖项的关联数组。

这是钩子的基本痕迹。

/**

 * Implements hook_update_dependencies().

 */

function my_module_update_dependencies() {

  $dependencies = [];

 

  return $dependencies;

}

我们如何创建模块依赖项数组?假设我们发现我们创建的某些自定义配置在Webform模块的升级过程中引起了上游问题。因此,我们需要在Webform模块上的更新挂钩之前修复该配置。

让我们创建一个更新挂钩,以对配置进行分类。

/**

  * Fix broken configuration.

  */

function my_module_update_8001() {

   $config = \Drupal::configFactory();

   // 在这里修复损坏的配置...

}

我们仍然需要确保此钩子在Webform模块中的钩子之前运行,因此我们创建一个hook_update_dependencies()钩子以便在Webform中的钩子之前运行我们的更新钩子。请注意,更新钩子webform_update_8501()不存在,它只是常用模块中的示例更新钩子。

/**

 * Implements hook_update_dependencies().

 */

function my_module_update_dependencies() {

  $dependencies = [];

 

  // 确保my_module_update_8001更新在webform_update_8501之前运行。

  $dependencies['webform'][8501]['my_module'] = 8001;

 

  return $dependencies;

}

此依赖项数组的基本语法如下。

$dependencies['RUN THIS'][HOOK ID]['AFTER THIS'] = HOOK ID;

您可以在此挂钩中建立许多依赖关系,以针对不同的模块。也可以将这些依赖项应用于站点中的任何可用钩子,如果没有您自己的模块,您将不受限于钩子。

实际使用情况

在Drupal贡献的代码中使用此钩子,以确保首先运行模块所依赖的更新。

例如,这是Webform模块使用的钩子,以确保在Webform模块执行自己的更新之前,某些字段存在于表中(由系统更新创建)。

/**

 * Implements hook_update_dependencies().

 */

function webform_update_dependencies() {

  // 确保system_update_8501()在更新Webform之前运行,以便

  // 新的version_default字段将安装在正确的表中。

  // @see https://www.drupal.org/project/webform/issues/2958102

  $dependencies['webform'][8099]['system'] = 8501;

 

  return $dependencies;

}

另一个示例位于Facets模块中,该模块用于确保在facets模块更新挂钩之前运行block_content更新挂钩。在这种情况下,他们还将检查正在使用的Drupal的特定版本。

/**

 * Implements hook_update_dependencies().

 */

function facets_update_dependencies() {

  $dependencies = [];

 

  if (version_compare(\Drupal::VERSION, '8.6', '>=')

    && \Drupal::service('module_handler')->moduleExists('block_content')

  ) {

    // block_content_update_8600()将一些字段添加到块中

    // 如果同时升级facets_update_8006()将会失败。

    $dependencies['facets'][8006] = [

      'block_content' => 8600,

    ];

  }

 

  return $dependencies;

}

结论

一个警告词是,需要使用此挂钩来允许更新生效,这可能意味着正在处理的站点存在一些问题。我在过去的项目中发现,此挂钩是解决不完整升级的好方法。

例如,如果代码已更新,则运行数据库更新,然后代码再次降级而未删除新创建的表,则在尝试重新创建这些表时,后续升级将出错。使用自定义更新挂钩删除表,然后使用hook_update_dependencies()挂钩是清除这些更新运行方式的好方法。

也就是说,这是确保更新过程以一致且可预测的方式运行的好方法,尤其是在执行涉及许多模块的大型复杂更新时。

以上是 Drupal 8:更改更新依赖项 的全部内容, 来源链接: utcz.com/z/347633.html

回到顶部