$hidden 是 laravel 模型字段隐藏的基础机制,仅作用于当前模型序列化;api resource 提供条件化精控;makehidden/makevisible 用于临时覆盖;关联模型需独立配置隐藏规则。

模型里用 $hidden 排除字段最直接
API 返回用户数据时,password、remember_token 这类字段必须不出现,Laravel 提供了最轻量的机制:$hidden 属性。它作用于模型实例序列化(比如 toArray()、toJson() 或 API Resource 自动调用时),是响应层过滤的起点。
-
$hidden是硬排除:只要设置了,不管用不用Resource、也不管是不是api.php路由,只要模型被转成数组/JSON 就生效 - 只对当前模型生效,子模型(如关联的
Profile)不会继承,得各自定义 - 别和
$casts混用——比如把password_hash放进$hidden,但数据库字段其实是password;字段名必须和模型属性名一致(即getAttribute()返回的键名) - 示例:
class User extends Model { protected $hidden = ['password', 'remember_token']; }
API Resource 里用 toArray() 精控字段更安全
$hidden 太粗粒度,比如管理后台要返回 last_login_at,但 API 不想暴露;或者想动态隐藏(如仅当用户非管理员时才隐藏 is_verified)。这时必须用 ApiResource,它在序列化前拦截并重写结构。
- Resource 的
toArray()方法里,可以条件判断、调用其他方法、甚至查库——$hidden做不到这点 - 别在 Resource 里直接 return
$this->resource->toArray(),这会绕过你写的逻辑,也绕过$hidden(因为toArray()已执行过一次) - 敏感字段不要靠前端 JS 过滤,Resource 是最后一道服务端防线
- 示例:
class UserResource extends JsonResource { public function toArray($request) { $base = [ 'id' => $this->id, 'name' => $this->name, 'email' => $this->email, ]; if ($request->user()?->can('view_sensitive_data')) { $base['last_login_at'] = $this->last_login_at; } return $base; } }
makeHidden() 和 makeVisible() 适合临时覆盖
有时候你得在某个接口里临时“显形”一个被 $hidden 拦住的字段(比如调试用的 debug_info),又不想改模型定义——makeHidden() 和 makeVisible() 就是为此设计的链式方法。
- 它们只影响当前模型实例,不影响其他查询结果,也不改变模型类定义
- 注意顺序:
makeVisible()必须在makeHidden()之后调用才有效,否则会被后者覆盖 - 别在循环里反复调用,性能无必要损耗;更别在模型事件(如
saving)里用,容易引发意外序列化 - 示例:
$user = User::find(1)->makeVisible(['password'])->makeHidden(['remember_token']);
别漏掉 Eloquent 关联关系里的敏感字段
很多人只在主模型设 $hidden,结果 $user->posts 返回的集合里,每个 Post 模型的 content 或 author_id 依然裸奔。关联模型的隐藏逻辑是独立的,必须各自处理。
- 每个关联模型(
Post、Comment)都要单独定义$hidden,Resource 也要对应封装 - 用
with()预加载时,Laravel 不会自动应用主模型的隐藏规则到子模型 - 如果关联字段本身是敏感的(比如
Post::belongsTo(User::class)的外键user_id),而你又不想暴露,就得在PostResource里手动剔除,或在Post模型里加$hidden = ['user_id'] - 验证是否漏掉:用
Tinker执行User::with('posts')->first()->toArray(),直接看输出结构
$hidden 是基础,Resource 是主力,临时方法是补丁,而关联模型得一个个盯——最容易出问题的地方,永远在你没显式声明隐藏的那层嵌套里。大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











