Yii中RESTful接口需显式配置:控制器继承ActiveController并设modelClass,urlManager添加yii\rest\UrlRule规则,模块init中禁用layout和CSRF,且路径、命名空间、模块ID须严格大小写一致。

RESTful 接口在 Yii 模块里不是“加个注解就自动变 API”,必须显式启用 UrlManager 规则、继承 ActiveController、并关闭视图渲染 —— 否则返回 HTML 页面或 404。
模块内控制器必须继承 ActiveController,不能用普通 Controller
Yii 的 REST 支持由 yii\rest\ActiveController 提供,它自带标准动作(index、view、create 等)和数据序列化逻辑。用普通 Controller 写 actionIndex() 不会自动支持 Accept: application/json 响应头协商,也不会处理 _format=json 参数。
- 控制器类必须声明
public $modelClass = 'app\models\Post';,否则ActiveController不知道查哪个模型 - 如果模型不在默认命名空间(如
common\models\Post),要写全路径,不能只写Post - 不建议在
ActiveController里重写beforeAction()干涉响应格式,容易破坏内置的ContentNegotiator行为
urlManager 必须为模块配置独立的 REST 路由规则
模块注册时的 ID(如 'api')只是路由前缀,不会自动启用 REST 风格。你得在应用级 urlManager 中显式添加模块专用规则,否则 /api/v1/posts 仍走默认解析,报 404 或跳转到错误控制器。
- 规则要放在
rules数组里,且需带class指向yii\rest\UrlRule:['class' => 'yii\rest\UrlRule', 'controller' => ['api/v1/post']] -
controller键值必须是数组,且格式为['模块ID/版本/控制器ID'];写成'api/v1/post'字符串会失效 - 若模块有多个控制器(如
post、user),不要拆成多条规则,用数组合并:['api/v1/post', 'api/v1/user'] - 别漏掉
'pluralize' => true(默认开启),否则/posts会匹配不到PostController
模块配置里要禁用布局和视图,否则返回 HTML 包裹的 JSON
模块默认继承应用的 layout 和 viewPath,而 ActiveController 的动作(如 index)默认会尝试渲染视图。结果就是 JSON 数据被套进 <html><body>{...}</body></html> —— 前端解析失败。
- 在模块类的
init()方法里加:$this->layout = false;和$this->enableCsrfValidation = false;(API 不需要 CSRF) - 更彻底的做法:在模块配置中直接关闭视图渲染:
'api' => ['class' => 'app\modules\api\Module', 'as contentNegotiator' => ['class' => 'yii\filters\ContentNegotiator', 'formats' => ['application/json' => \yii\web\Response::FORMAT_JSON]]] - 注意
ContentNegotiator是行为(behavior),必须用as语法注册,写成'behaviors'数组会无效
常见 404 场景:模块 ID、控制器 ID、URL 路径三者大小写必须完全一致
Yii 的模块路由是严格区分大小写的。比如模块注册为 'api',控制器类名是 PostController,那合法 URL 只能是 /api/v1/posts(小写 api + 小写复数 posts)。任何偏差都会 404:
-
/API/v1/posts→ 模块 ID 不匹配,找不到模块 -
/api/v1/Post→ 控制器 ID 应为小写post,不是类名PostController -
/api/v1/post/123→ 正确;但/api/v1/post?id=123不会触发view动作,因为 REST 规则只认路径参数 - 调试时可用
yii\helpers\Url::to(['api/v1/post/index'])看生成的 URL 是否符合预期
最易忽略的是模块类文件路径与命名空间不一致:比如模块类是 app\modules\api\v1\Module,但文件放在 modules/api/Module.php,Yii 就加载不到 —— 这种错误不报错,只静默失败。路径、命名空间、注册时的 class 值,三者必须咬死对齐。


















