在 Laravel 中,$fillable
属性在模型中扮演着非常重要的角色。它是一个数组,指定了可以被批量赋值的属性列表。批量赋值是指在创建或更新模型时,通过一个数组来赋值给模型的属性,这在处理表单数据时特别有用。
使用 $fillable
可以增加应用程序的安全性,防止用户恶意更新模型中不应该被直接更新的属性,这种安全漏洞通常称为“批量赋值漏洞”(Mass Assignment Vulnerability)。
示例
假设你有一个 User
模型,它有 name
、email
和 password
等属性。你可能不希望用户能够直接更新某些敏感字段,如 password
,因此你可以在模型中使用 $fillable
来定义哪些属性是可以被批量更新的。
class User extends Model
{
protected $fillable = ['name', 'email'];
}
在上面的例子中,$fillable
属性包含了 name
和 email
,这意味着只有这两个属性可以通过批量赋值来更新。如果尝试更新模型时传入了不在 $fillable
数组中的属性,如 password
,那么这个属性将不会被赋值。
使用批量赋值
当使用 Eloquent 的 create
或 update
方法时,Laravel 会检查 $fillable
属性来确定哪些给定的数组键值可以被批量赋值。
// 创建新用户
$user = User::create([
'name' => 'John Doe',
'email' => 'john@example.com',
// 'password' => 'secret',因为 'password' 不在 $fillable 中,所以这里不会被赋值
]);
// 更新用户信息
$user->update([
'name' => 'Jane Doe',
// 同样,任何不在 $fillable 中的属性都不会被更新
]);
重要提示
- 使用
$fillable
时,务必确保所有应该被用户更新的字段都包含在数组中,否则这些字段将无法通过批量更新被修改。 - 另一个与
$fillable
相对的属性是$guarded
,它定义了哪些属性不可以被批量赋值。注意,不要同时使用$fillable
和$guarded
,因为这可能会导致混淆和错误。一般来说,使用$fillable
更加推荐,因为它可以明确指出哪些字段是安全的。
通过合理使用 $fillable
,你可以在保证 Laravel 应用程序安全的同时,方便地处理批量数据更新。