直接继承yii\rest\activecontroller是最快路径,但需确保url规则启用复数化、开启美化与严格解析,手动声明options动词支持,并在模型fields()中统一控制返回字段,避免重写actions()破坏分页逻辑。

直接继承 yii\rest\ActiveController 是最快路径,它自动绑定 index、view、create、update、delete 五个动作,只要模型是 ActiveRecord,几乎不用写逻辑——但多数人卡在路由 404、OPTIONS 被拦、字段漏脱敏这三处。
为什么 /users 访问返回 404
根本不是代码没写对,而是 URL 规则没匹配上。Yii2 的 yii\rest\UrlRule 默认启用复数化(pluralize),模型叫 User,它只认 /users,不认 /user;同时要求 urlManager 必须开启美化和严格解析:
-
'enablePrettyUrl' => true和'enableStrictParsing' => true缺一不可 -
rules中必须显式注册:['class' => 'yii\rest\UrlRule', 'controller' => 'user'] - 控制器里
public $modelClass = 'app\models\User'必须指向完整命名空间,不能漏app\models\ - 如果模型主键不是
id(比如是uid),得重写findModel(),否则GET /users/123查不到数据
OPTIONS 请求直接 404 或跨域失败
这不是 CORS 配置没开的问题,而是 Yii2 根本没把 OPTIONS 当作合法动词路由过去。浏览器发带 Authorization 或自定义 header 的请求前,会先发 OPTIONS 预检,没响应就直接拦截。
- REST 模块不会自动为每个动作注册 OPTIONS 处理器,必须手动声明支持的动词:
public $verbs = ['index' => ['GET', 'HEAD', 'OPTIONS']] - 全局配置里,
as cors的'Access-Control-Allow-Methods'必须显式包含OPTIONS,例如:'GET, POST, PUT, DELETE, OPTIONS' - Nginx/Apache 可能默认拒绝 OPTIONS,需检查服务器配置是否返回 405;Nginx 要加
add_header Access-Control-Allow-Methods ...并确保未用limit_except拦截
怎么控制 API 返回哪些字段
别在控制器里 return ['name' => $model->name],那会绕过 yii\rest\Serializer,丢失分页、状态码、关联数据嵌套等 REST 特性。
- 统一在模型里重写
fields()方法,用unset($array['password_hash'])剔除敏感字段 - 加计算字段:
'full_name' => function ($model) { return $model->first_name . ' ' . $model->last_name; } - 要嵌套关联数据(如用户所属部门),在
fields()里加'department' => function ($model) { return $model->department; },前提是模型已定义好getDepartment()关联方法 - 若需不同接口返回不同字段集,可按场景传参,再在
fields()内部判断Yii::$app->requestedRoute
真正容易被忽略的是:yii\rest\ActiveController 的动作行为(比如 index 的分页逻辑)依赖 prepareDataProvider 返回的数据提供者,一旦你重写了 actions() 却没保留这个回调,列表接口就可能失去分页或过滤能力。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











