# 控制器

控制器是JavaScript文件,其中包含一组称为操作的方法,由客户端根据请求的 route 访问。 每当客户端请求路由时,该操作都会执行业务逻辑代码并返回 response. 控制器表示 model-view-controller (MVC) 模式中的 C。

在大多数情况下,控制器将包含项目业务逻辑的大部分。但是随着控制器的逻辑变得越来越复杂,使用 services 将代码组织成可重用部分是一种很好的做法。

# 实现

控制器可以 generated or added manually。Strapi提供了一个 createCoreController 工厂功能,可以自动生成核心控制器,并允许构建自定义控制器或扩展或替换生成的控制器

# 添加新控制器

以下方式可以实现新的控制器:

  • 使用 交互式命令 CLI 命令 strapi generate
  • 或通过创建 JavaScript 文件手动:
    • 在 API 控制器的 ./src/api/[api-name]/controllers/ 中(这个位置很重要,因为 Strapi 从那里自动加载控制器)
    • 或者在插件控制器的 ./src/plugins/[plugin-name]/server/controllers/ 这样的文件夹中,只要插件接口正确导出到 strapi-server.js 文件中,就可以在其他地方创建它们 (参见 Server API for Plugins 文档)

每个控制器操作都可以是 asyncsync 功能。每个操作都会接收一个上下文对象 (ctx) 作为参数。ctx 包含 request contextresponse context.

实例:GET /hello 路由调用基本控制器

定义了一个特定的 GET /hello route,路由器文件的名称 (即 index) 用于调用控制器处理程序(即 index)。每次向服务器发送 GET /hello 请求时, Strapi 都会在 hello.js 控制器中调用 index 操作并返回 Hello World!

✏️ NOTE

当创建新的 content-type 时, Strapi 会使用占位符代码构建一个通用控制器,该控制器可供自定义。

# 扩展核心控制器

将为每个内容类型创建默认控制器和操作。这些默认控制器用于返回对 API 请求的响应(例如,当访问 GET /api/articles/3 时,将调用 "Article" 内容类型的默认控制器的 findOne 操作)。可以自定义默认控制器以实现您自己的逻辑。下面的代码示例应该可以帮助您入门。

💡 TIP

来自核心控制器的操作可以完全替换为 创建自定义操作 并将操作命名为与原始操作相同的操作(例如 find, findOne, create, update, 或 delete)。

集合类型示例
Single type examples

# 用途

控制器已声明并附加到路由。调用路由时会自动调用控制器,因此通常不需要显式调用控制器。但是 services 可以调用控制器,在这种情况下,应使用以下语法:

// access an API controller
strapi.controller('api::api-name.controller-name');
// access a plugin controller
strapi.controller('plugin::plugin-name.controller-name');

💡 TIP

要列出所有可用的控制器,请运行 yarn strapi controllers:list.