Yii2没有独立的Resource类,资源由ActiveRecord模型、ActiveController控制器和路由规则共同定义;应通过模型的rules()、fields()、scenarios()等方法控制验证与输出,而非创建Resource类。

Yii 没有独立的 Resource 类——你不需要、也不应该手动写一个叫 Resource 的类来“定义资源”。所谓“资源”,在 Yii2 RESTful 中就是模型(ActiveRecord)+ 控制器(ActiveController)+ 路由规则三者共同表达的语义,不是靠某个抽象类实现的。
为什么找不到 Resource 类?
Yii2 的 RESTful 实现不走 Laravel 那套 “Resource 类负责格式化输出” 的路径。它默认把 ActiveRecord 实例直接序列化为 JSON,字段、关系、日期格式都由模型自身和全局 Response 配置决定。强行模仿其他框架去建 App\Resources\UserResource,反而会绕过 Yii 的行为链(比如 Serializer、ContentNegotiator),导致分页失效、关系未展开、时间戳变字符串等问题。
真正该定义的“资源”实体是 ActiveRecord 模型
资源的核心数据结构和约束必须落在模型里,而不是某个包装类:
-
rules()决定哪些字段可写、是否必填、是否唯一——这直接影响POST /users的校验结果 -
fields()和extraFields()控制 API 输出字段(比如隐藏password_hash,暴露profile关系) -
scenarios()可为不同动作(createvsupdate)启用不同验证集 - 关联定义(
getOrders())配合expand=orders查询参数自动加载关系
自定义输出结构?别动 Resource,改 Serializer 或 Response
如果需要统一加 code/message 包裹、或对不同状态返回不同结构(如 404 返回空 data),正确做法是:
- 继承
yii\rest\Serializer,重写serialize()方法,在这里加工$data;然后在控制器中设public $serializer = 'app\serializers\ApiSerializer'; - 或更常用:继承
yii\web\Response(如知识库提到的ApiResponse),在prepare()里统一包壳——它作用于所有响应,不区分动作 - 避免在每个
actionXXX()里手工return ['code'=>0, 'data'=>$model],那会绕过分页对象、关系展开、HTTP 状态码自动设置等机制
想支持 HATEOAS 或超媒体链接?用 Linkable 接口
Yii2 原生支持通过实现 yii\base\Linkable 接口让模型自己提供链接(如 self、next)。这不是靠 Resource 类,而是模型主动声明:
use yii\base\Linkable;
use yii\helpers\Url;
class User extends ActiveRecord implements Linkable
{
public function getLinks()
{
return [
'self' => Url::to(['user/view', 'id' => $this->id], true),
'orders' => Url::to(['order/index', 'user_id' => $this->id], true),
];
}
}
只要控制器启用了 Serializer(默认已启用),这些链接就会自动注入到响应 JSON 的 _links 字段中。
真正容易被忽略的是:资源的边界感不在类名里,而在 UrlRule 的 controller 配置和模型的 tableName() 之间——URL 路径、数据库表、模型类名三者对齐了,资源才立得住。别花时间找不存在的 Resource 类,盯紧这三个点就够了。


















