# 服务
服务是一组可重用的函数。它们对于尊重 "don’t repeat yourself" (DRY) 编程概念和简化控制器 逻辑特别有用。
# 实现
服务可以手动生成或添加。Strapi提供了一个“createCoreService”工厂功能,该函数自动生成核心服务,并允许构建自定义服务或扩展或替换生成的服务。
# 添加新服务
以下方式可以实现新服务:
- 使用 交互式 CLI 命令
strapi generate
- 或通过在相应的文件夹中创建 JavaScript 文件来手动操作 (参见 project structure):
./src/api/[api-name]/services/
用于 API 服务- 或
./src/plugins/[plugin-name]/services/
用于插件服务
要手动创建服务,请导出返回服务实现的工厂函数(即带有方法的对象)。此工厂函数接收 strapi
实例:
🤓 Entity Service API
要开始创建自己的服务,请参阅 Entity Service API 文档中的 Strapi 内置函数。
电子邮件服务示例
服务的目标是存储可重用的函数。email
服务可用于从我们的代码库中的不同函数发送电子邮件:
该服务现在可以通过 strapi.service('api::email.email').send(...args)
的全局变量。它可以在代码库的另一部分中使用,如在以下控制器中:
✏️ NOTE
当创建新的 content-type 时,Strapi 会使用占位符代码构建一个通用服务,该代码随时可以自定义。
# 扩展核心服务
核心服务是为每个内容类型创建的,可以由 controllers 使用,通过 Strapi 项目执行可重用的逻辑。可以自定义核心服务以实现您自己的逻辑。下面的代码示例应该可以帮助您入门。
💡 TIP
核心服务可以完全替换为创建自定义服务,并将其命名为与核心服务相同的名称(例如,find
, findOne
, create
, update
, 或 delete
)。
集合类型示例
单一类型示例
# 用法
创建服务后,可以从 controllers 或其他服务访问它:
// access an API service
strapi.service('api::apiName.serviceName');
// access a plugin service
strapi.service('plugin::pluginName.serviceName');
💡 TIP
要列出所有可用的服务,请运行 yarn strapi services:list
.
:::