# 控制器
控制器是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 文档)
- 在 API 控制器的
每个控制器操作都可以是 async
或 sync
功能。每个操作都会接收一个上下文对象 (ctx
) 作为参数。ctx
包含 request context 和 response 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
.