yii 2.0 基于 activecontroller 实现 restful 接口,依赖控制器继承与行为配置;yii 3.0 采用 action-based 架构,通过可调用类或闭包直接处理请求,解耦控制器,更轻量灵活。

Yii 2.0 和 Yii 3.0 写 RESTful 接口思路相似,但实现方式差异明显:2.0 基于控制器+行为(Behavior)驱动,3.0 转向更轻量、更面向接口的 Action-based 架构,不再强制依赖控制器类。
Yii 2.0:用 REST Controller + ActiveController 快速起步
Yii 2.0 的 REST 支持内建在 yii\rest\ActiveController 中,适合与 ActiveRecord 配合使用,几行配置就能暴露标准 CRUD 接口。
- 继承
yii\rest\ActiveController,指定$modelClass,例如:public $modelClass = 'app\models\User'; - 在 URL 管理器中启用 RESTful 路由规则(
'rules' => ['POST <controller>' => '<controller>/create']</controller></controller>等) - 默认支持 GET /users、GET /users/1、POST /users、PUT /users/1、DELETE /users/1
- 如需自定义行为(如鉴权、字段过滤),可覆盖
behaviors()方法,添加authenticator或contentNegotiator
Yii 3.0:用 Action + Endpoint 类替代 Controller
Yii 3.0 不再推荐继承长生命周期的 Controller,而是通过 Action 类或闭包直接处理请求,更灵活也更利于测试。
- 定义一个 Action 类(如
UserIndexAction),实现__invoke()方法,返回Response或数组 - 在路由配置中绑定路径与 Action:
['GET', '/api/users', [UserIndexAction::class]] - 模型层仍可用 ActiveRecord,但数据获取逻辑写在 Action 内部,不耦合到基类
- 序列化统一由
JsonResponseFormatter处理,状态码、错误格式需手动控制(比如 throwNotFoundHttpException自动返回 404)
共通关键点:认证、数据验证和响应规范
无论哪个版本,REST 接口质量取决于这三块是否扎实。
-
认证:2.0 常用
HttpBearerAuth或QueryParamAuth;3.0 推荐在 Action 开头调用$this->auth->authenticate()或用中间件拦截 -
验证:2.0 在 Model 的
rules()中声明,自动触发;3.0 可用Validator手动校验,或搭配RequestModel封装输入 -
响应结构:建议统一包装为
['code' => 0, 'message' => '', 'data' => [...]],2.0 可覆写serializeData(),3.0 直接在 Action 中 return 数组即可
快速验证与调试小技巧
上线前别跳过这几步,能省掉一半联调时间。
- 用
curl -i -X GET http://localhost/api/users看状态码和 headers 是否正确(特别是 Content-Type: application/json) - Yii 2.0 查看日志里是否触发了
ActiveController::actions();Yii 3.0 检查路由是否匹配到对应 Action 实例 - 开启
debug模式后,2.0 会显示 API 响应模板,3.0 可配合yiisoft/log输出请求上下文











