📅  最后修改于: 2023-12-03 15:22:55.589000             🧑  作者: Mango
在Laravel中,可以通过在模型中定义 $guarded
属性来保护一些模型属性,防止它们在批量赋值的时候被赋值。
批量赋值是指一次性给模型赋多个属性值,比如创建一个新的模型或更新一个已存在的模型。当我们使用 create()
或 update()
方法时,就很容易进行批量赋值。
// 批量创建新模型
$post = App\Models\Post::create([
'title' => 'Example Title',
'content' => 'Example Content',
]);
// 批量更新现有模型
$post = App\Models\Post::find(1);
$post->update([
'title' => 'New Title',
'content' => 'New Content',
]);
在这些例子中,我们将多个属性一起传递给了模型,create()
和 update()
方法会自动将这些属性保存在数据库中。
然而,这种便捷的批量赋值方式存在一个安全问题:如果没有正确的限制,用户可以通过批量赋值来更新他们没有权限更新的属性。这样就会导致严重的安全问题。
为了解决这个安全问题,Laravel提供了两种罗列方式:
要进行保护,需要在模型中定义 $guarded
属性。 $guarded
是一个数组,用于指定那些模型属性不可以被批量赋值。
如果只需要保护一些属性,可以将这些属性名称列出来。如下例:
class Post extends Model
{
protected $guarded = ['id', 'user_id', 'created_at', 'updated_at'];
}
在这个例子中,id
、user_id
、created_at
和 updated_at
属性将会被保护。这些属性将不会再被批量赋值修改。
如果所有的属性都允许修改,可以设置 $guarded
为空数组:
class Post extends Model
{
protected $guarded = [];
}
这个时候,所有的属性都可以被批量赋值修改。
$guarded
属性当你使用 create()
或 update()
方法时,Laravel会自动检查 $guarded
属性。
如果 $guarded
属性被设置为一个非空数组,那么在批量赋值时,属性名称列表中的数据会被放行,但是其他的属性将会被限制。
如果 $guarded
属性被设置为空数组,那么在批量赋值时,所有的属性将被允许修改。
在Laravel中,使用 $guarded
属性可以保护模型的属性,防止在批量赋值过程中出现安全问题。此外,还可以通过设置 $guarded
的值为一个空数组,来允许所有属性都可以被批量赋值修改。