📜  受保护的表 laravel - PHP (1)

📅  最后修改于: 2023-12-03 15:22:55.589000             🧑  作者: Mango

受保护的表 laravel - PHP

在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提供了两种罗列方式:

  1. 保护所有的属性,除了列出来的
  2. 设置允许所有属性可修改
如何保护表

要进行保护,需要在模型中定义 $guarded 属性。 $guarded 是一个数组,用于指定那些模型属性不可以被批量赋值。

保护部分属性

如果只需要保护一些属性,可以将这些属性名称列出来。如下例:

class Post extends Model
{
    protected $guarded = ['id', 'user_id', 'created_at', 'updated_at'];
}

在这个例子中,iduser_idcreated_atupdated_at 属性将会被保护。这些属性将不会再被批量赋值修改。

所有属性都允许

如果所有的属性都允许修改,可以设置 $guarded 为空数组:

class Post extends Model
{
    protected $guarded = [];
}

这个时候,所有的属性都可以被批量赋值修改。

如何使用 $guarded 属性

当你使用 create()update() 方法时,Laravel会自动检查 $guarded 属性。

如果 $guarded 属性被设置为一个非空数组,那么在批量赋值时,属性名称列表中的数据会被放行,但是其他的属性将会被限制。

如果 $guarded 属性被设置为空数组,那么在批量赋值时,所有的属性将被允许修改。

summary

在Laravel中,使用 $guarded 属性可以保护模型的属性,防止在批量赋值过程中出现安全问题。此外,还可以通过设置 $guarded 的值为一个空数组,来允许所有属性都可以被批量赋值修改。