数据库生命周期钩子随文档服务 API 方法以不同方式触发

页面摘要: 在 Strapi 5 中,使用文档服务 API 方法时,数据库生命周期钩子会以不同方式触发,具体取决于操作类型和由新的草稿与发布系统引起的状态变化。

在 Strapi 5 中,数据库生命周期钩子随各种 文档服务 API 方法以不同方式触发,这主要源于 草稿与发布 功能工作方式的变化。

大多数用例应只使用文档服务。文档服务 API 处理了草稿与发布、i18n 以及任何底层的 strapi 逻辑。

不过,文档服务 API 可能无法满足你的所有用例;因此数据库层是暴露出来的,允许你在没有任何限制的情况下对数据库进行任何操作。此时用户就需要借助数据库生命周期钩子这一机制来扩展数据库行为。

本页面是破坏性变更数据库的一部分,提供有关该破坏性变更的信息,以及从 Strapi v4 迁移到 Strapi 5 的附加说明。

破坏性变更说明

在 Strapi v4 中

在 Strapi v4 中,生命周期钩子的工作方式如 Strapi v4 文档 中所述。

在 Strapi 5 中

生命周期钩子的工作方式与 Strapi v4 相同,但触发方式不同,具体取决于触发了哪些文档服务 API 方法。完整的参考说明请参阅 说明。

迁移

本节汇总了关于该破坏性变更的有用说明和操作步骤。

说明

由文档服务 API 方法触发的数据库生命周期钩子 {#table}

根据调用的 文档服务 API 方法,会触发以下数据库生命周期钩子:

Document Service API 方法触发的数据库生命周期钩子
findOne()before(after) findOne
findFirst()before(after) findOne
findMany()before(after) findMany
create()before(after) Create
create({ status: 'published' })
  • before(after) Create️ 由于同时创建草稿和已发布版本,会触发两次

  • before(after) Delete

  • 删除文档先前的草稿版本

  • 如果删除多个语言版本,可能触发多次(每个语言版本一次)

| | update() |

  • before(after) Create 在为文档创建新的语言版本时

  • before(after) Update 在更新文档的现有版本时 | | update({ status: 'published' }) |

  • before(after) Create 如果删除多个语言版本,可能触发多次(每个语言版本一次)

  • before(after) Update 在更新文档的现有版本时

  • before(after) Delete

  • 删除文档先前的已发布版本

  • 如果删除多个语言版本,可能触发多次(每个语言版本一次)

| | delete() | before(after) Delete 如果删除多个语言版本,可能触发多次(每个语言版本一次) | | publish() |

  • before(after) Create 如果删除多个语言版本,可能触发多次(每个语言版本一次)

  • before(after) Delete

  • 删除文档先前的已发布版本

  • 如果删除多个语言版本,可能触发多次(每个语言版本一次)

| | unpublish() | before(after) Delete

  • 删除文档的所有已发布版本

  • 如果删除多个语言版本,可能触发多次(每个语言版本一次) | | discardDraft() |

  • before(after) Create

  • 创建新的草稿版本

  • 如果删除多个语言版本,可能触发多次(每个语言版本一次)

  • before(after) Delete

  • 删除文档先前的草稿版本

  • 如果删除多个语言版本,可能触发多次(每个语言版本一次)

| | count() | before(after) Count |

NOTE

批量操作的声明周期钩子(createMany、updateMany、deleteMany)永远不会被文档服务 API 方法触发。

手动操作步骤

用户可能需要根据 Strapi 5 中文档服务 API 方法触发生命周期钩子的方式来调整他们的自定义代码。

其他资源

你可以在 这篇博客文章 中找到关于生命周期钩子的更多信息。