用yii\rest\activecontroller创建restful接口核心三步:写模型、写控制器、配路由;但必须实现fields()方法指定返回字段,配置behaviors()添加鉴权,且urlmanager启用enableprettyurl并配好urlrule,否则易出403、404或数据泄露。

直接说结论:用 yii\rest\ActiveController 创建 RESTful 接口,核心就三步——写模型、写控制器、配路由。但跳过验证、权限或自定义行为,上线后大概率会出 403、404 或数据泄露。
怎么让 User 模型暴露成 REST API?
前提是已有可用的 User 模型(继承 yii\db\ActiveRecord),且数据库表存在、字段可读写。
- 必须实现
fields()方法,否则返回空对象或报错:public function fields() { return ['id', 'username', 'email', 'created_at']; } - 若需隐藏敏感字段(如
password_hash),别只靠前端过滤,必须在fields()里显式排除;extraFields()是可选扩展字段,不主动调用不会返回 - 模型没定义
scenarios()或没给create/update场景设规则,POST和PUT请求会静默失败或存入空值
ActiveController 默认行为有哪些坑?
它自动绑定了 index、view、create、update、delete 五个动作,但默认不校验权限、不处理软删除、不支持批量操作。
-
DELETE /users/123是真删(hard delete),不是软删;要加is_deleted字段逻辑,得重写actionDelete() - 所有动作默认允许匿名访问,生产环境必须加
behaviors()配置鉴权:public function behaviors() { $behaviors = parent::behaviors(); $behaviors['authenticator'] = [ 'class' => \yii\filters\auth\HttpBearerAuth::class, ]; return $behaviors; } - 分页参数
page和per-page有效,但expand(关联预加载)需模型中提前定义getXXX()关系方法,否则 400 错误
URL 规则配置为什么总 404?
常见原因不是写错路径,而是 urlManager 配置位置不对或未启用美化 URL。
-
'enablePrettyUrl' => true必须设为true,且 Web 服务器(Nginx/Apache)已配置重写规则,否则/index.php/users才能访问 -
UrlRule的controller值是控制器 ID(如user),不是类名(UserController);ID 小写、无Controller后缀 - 如果同时存在其他
UrlRule,顺序很重要:更具体的规则(如['pattern' => 'users/me', 'route' => 'user/me'])要放在yii\rest\UrlRule前面,否则被通配捕获
最常被忽略的是:模型里没加 public static function tableName() 返回正确表名,或数据库连接配置错误导致 find() 全部返回空——这时接口看似正常(200),但数据永远是空数组。











