yii的activecontroller需正确配置url规则、json解析、模型主键及类路径才能实现crud:必须用yii\rest\urlrule、配置jsonparser、确保模型primarykey()和tablename()正确、$modelclass指向可加载的activerecord类。

Yii 的 yii\rest\ActiveController 能自动实现基础 CRUD,但直接跑起来大概率 404 或 405 —— 根子在 URL 规则、请求解析和行为配置没对齐。
URL 路由必须用 yii\rest\UrlRule,不能手写正则
很多人在 urlManager.rules 里照搬普通控制器写法,比如 'api/posts' => 'post/index',这会导致 PUT/DELETE 请求被拒绝或跳转到错误动作。
-
yii\rest\UrlRule会自动映射GET /posts→index、POST /posts→create、GET /posts/123→view、PUT /posts/123→update、DELETE /posts/123→delete - 必须显式指定
'class' => 'yii\rest\UrlRule',且'controller'值是控制器 ID(如'post'),不是完整类名 - 别漏掉
'enablePrettyUrl' => true和'showScriptName' => false,否则/index.php/posts这种路径会让前端调用异常别扭
Content-Type: application/json 请求体不会自动解析
发 JSON 数据时,$_POST 是空的,$request->getBodyParams() 也拿不到 —— Yii 默认不解析 JSON。
- 必须在控制器或全局
request组件中配'parsers' => ['application/json' => 'yii\web\JsonParser'] - 如果只给某个控制器用,写在
behaviors()里更安全:$behaviors['parser'] = ['class' => 'yii\filters\ContentNegotiator', 'formats' => ['application/json' => Response::FORMAT_JSON']]不行,那是响应格式,不是请求解析 - 测试时用 curl 确认头是否带全:
curl -X POST http://api.example.com/posts -H "Content-Type: application/json" -d '{"name":"test"}'
405 Method Not Allowed 多半是模型没配好主键或动作被禁用
比如 GET /posts/1 返回 405,不是路由问题,而是 ActiveController 检查模型时失败了。
- 确保模型类的
primaryKey()方法返回非空数组,哪怕只有一列:return ['id']; - 检查模型表名是否正确:
tableName()返回的字符串要跟数据库实际表名一致(大小写敏感取决于 DB 配置) -
ActiveController默认只开放index、view、create、update、delete,如果重写了actions()却没显式保留这些,就会 405
认证和字段过滤得手动加,ActiveController 不管这些
开箱即用的 CRUD 只处理逻辑,权限、字段脱敏、输入校验都得自己补。
- 加 Token 认证:在
behaviors()里塞'authenticator' => HttpBearerAuth::className(),并确保请求带Authorization: Bearer xxx - 限制输出字段:重写
fields()方法,比如unset($array['password_hash']); return $array; - 批量赋值白名单:模型里
rules()中的'safe'属性只控制验证,真正防 mass-assignment 要靠scenarios()和load($data, '')的第二个参数
最常被忽略的是:控制器继承 ActiveController 后,$modelClass 必须指向一个真实存在的 ActiveRecord 类,且该类能被自动加载 —— 类名拼错、命名空间漏写、文件名大小写不匹配,都会静默失败,日志里可能只报 Invalid Configuration – yii\base\InvalidConfigException,不指明哪一行。











