继承 yii\rest\activecontroller 可快速搭建 rest 接口,自动支持 index/view/create/update/delete 五个动作;需正确配置 modelclass、启用复数化路由、处理 options 预检请求、自定义序列化字段及启用 json 解析器。

怎么用 yii\rest\ActiveController 快速搭出一个可用接口
直接继承 yii\rest\ActiveController 是最快路径,它自动绑定 index、view、create、update、delete 五个动作,只要模型有 ActiveRecord 基础,几乎不用写逻辑。
常见错误是没配好 modelClass 或忘了在 URL 规则里加 pluralize —— 比如模型叫 User,默认路由会期待 /users 而不是 /user,不匹配就 404。
- 控制器里必须设置
public $modelClass = 'app\models\User'; - URL 管理配置中要启用复数化:
'enablePrettyUrl' => true+'showScriptName' => false,并确保urlManager的rules包含['class' => 'yii\rest\UrlRule', 'controller' => 'user'] - 如果模型主键不是
id(比如是uid),得重写findModel()方法,否则GET /users/123会查不到
为什么 OPTIONS 请求返回 404 或跨域失败
Yii2 默认不自动处理预检请求(OPTIONS),前端发带 Authorization 或自定义 header 的请求时,浏览器先发 OPTIONS,没响应就直接拦掉。
这不是 CORS 配置没开的问题,而是路由根本没匹配到。RESTful 模块不会为每个动作自动注册 OPTIONS 处理器。
- 在控制器里显式声明支持的方法:
public $verbs = ['index' => ['GET', 'HEAD', 'OPTIONS']] - 或者全局加中间件:在
config/web.php的as cors配置里,确保'Access-Control-Allow-Methods' => 'GET, POST, PUT, DELETE, OPTIONS' - 注意 nginx/Apache 是否拦截了
OPTIONS请求——有些服务器配置会直接返回 405,得显式放行
yii\rest\Serializer 返回字段怎么精简或扩展
默认序列化只输出模型的 attributes(),但实际接口常要隐藏敏感字段(如 password_hash)、加计算字段(如 full_name)或嵌套关联数据(如用户所属部门)。
别在控制器里手动拼数组,那会绕过序列化流程,丢失分页、状态码等 RESTful 特性。
- 重写模型的
fields()方法,用unset($array['password_hash'])剔除字段 - 在
fields()里加虚拟字段:'full_name' => function ($model) { return $model->first_name . ' ' . $model->last_name; } - 关联数据用
extraFields()+expand参数实现按需加载,比如?expand=department,避免 N+1
POST/PUT 提交 JSON 数据却拿不到参数
Yii2 默认只从 $_POST 和 application/x-www-form-urlencoded 解析请求体,前端用 fetch 发 Content-Type: application/json 时,Yii::$app->request->post() 是空的。
这不是前端问题,也不是没写 Yii::$app->request->getBodyParams() —— 而是没启用 JSON 输入解析器。
- 在应用配置
components['request']里加:'parsers' => ['application/json' => 'yii\web\JsonParser'] - 确保请求头真正是
Content-Type: application/json,有些前端库(比如 axios)默认不设,得手动指定 - 如果用了
Yii::$app->request->getBodyParam('name'),它底层会自动调用解析器;但post()不会,别混用










