在Laravel项目里,模型通常对应数据库表,当我们把模型直接转成数组或JSON返回给前端时,像password、remember_token这类敏感字段可能被一并带出。Laravel提供了简单机制来隐藏这些字段,防止信息泄露。

使用模型的hidden属性
在Eloquent模型中定义一个$hidden数组,把不希望出现在数组或JSON里的字段名放进去即可。这些字段在toArray()和toJson()时会被自动剔除。
<?php
namespace AppModels;
use IlluminateDatabaseEloquentModel;
class User extends Model
{
// 需要隐藏的字段
protected $hidden = [
'password',
'remember_token',
'api_token',
];
}
临时隐藏与显示字段
如果某个接口需要临时隐藏额外字段,可以用makeHidden方法;相对地,makeVisible能把hidden中声明的字段临时显示出来。
<?php
$user = User::find(1);
// 临时再隐藏email
$data = $user->makeHidden('email')->toArray();
// 临时显示被隐藏的password
$info = $user->makeVisible('password')->toArray();
使用visible白名单
除了隐藏黑名单,也可以定义$visible,只有里面的字段才会出现在数组或JSON中。适合字段很多但对外暴露很少的情况。
<?php
class User extends Model
{
protected $visible = [
'id',
'name',
'email',
];
}
关联模型中的隐藏
如果模型有关联,比如User有Profile,也可以在关联模型里设置hidden。或者在加载后统一处理:
<?php
$users = User::with('profile')->get()->makeHidden('password');
注意事项
- hidden只影响数组和JSON转换,不限制你直接访问模型属性,例如$user->password仍能取到值。
- 在资源类API Resource中,也可以不取这些字段,双重保险。
- 不要依赖隐藏来处理鉴权,该加密的密码仍要用Hash::make处理。
合理运用hidden和visible,可以让Laravel模型在不同场景安全地输出数据,减少敏感信息外泄可能。