Laravel:为什么 Eloquent 显示隐藏字段?

rya*_*b92 1 php laravel tinker

只需在字段名称前添加 # 前缀即可

我正在使用 Laravel Breeze,它默认将passwordremember_token字段设置为隐藏。

class User extends Authenticatable
{
    use HasFactory, Notifiable;

    protected $fillable = [
        'username',
        'email',
        'password',
    ];

    protected $hidden = [
        'password',
        'remember_token',
    ];

    protected $casts = [
        'email_verified_at' => 'datetime',
    ];
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我获取在 Tinker 中运行的 User 实例,User::inRandomerOrder()->first()我仍然能够看到这些假定的隐藏字段。

App\Models\User {#4440
 id: 14,
 username: "verdie10",
 email: "jerrold.ziemann@example.org",
 email_verified_at: "2021-08-31 11:19:47",
 #password: "$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi",
 #remember_token: "F87k6RPxgi",
 created_at: "2021-08-31 11:19:47",
 updated_at: "2021-08-31 11:19:47",
},
Run Code Online (Sandbox Code Playgroud)

toy*_*oyi 6

这是因为仅当您将模型转换为数组或 JSON 时,这些字段才会隐藏。

从文档中:

有时您可能希望限制模型数组或 JSON 表示中包含的属性,例如密码。

有关此主题的完整文档可在此处找到: https: //laravel.com/docs/8.x/eloquent-serialization#hiding-attributes-from-json

目标是将它们从您的 API 响应中删除。

但是,当您在控制器、服务中使用模型时,您可能仍然会使用它们......这就是您看到它们的原因。

您可以通过执行以下操作来检查它是否有效:

$user = User::first();
$user->toArray(); // hidden attributes not included
$user->toJson(); // hidden attributes not included
Run Code Online (Sandbox Code Playgroud)