Laravel中的“质量分配”是什么意思?


159

当我浏览有关雄辩的ORM主题部分的Laravel文档时,我有了一个新名词Mass Assignment

文档显示如何进行批量分配和fillableguarded属性设置。但是在经历了这些之后,我Mass Assignment对它及其工作方式没有一个清晰的了解。

根据我过去在CodeIgniter中的经验,我也没有听说过这个词。

有人对此有一个简单的解释吗?


Answers:


206

质量分配是将数组发送到模型创建时,基本上是一次在模型上设置一堆字段,而不是一个接一个地设置,例如:

$user = new User(request()->all());

(这不是在模型上分别显式设置每个值。)

您可以fillable用来保护希望此字段实际允许更新的字段。

您还可以通过执行以下操作来阻止所有字段可批量分配:

protected $guarded = ['*'];

假设在您的用户表中,您有一个字段,user_type并且可以包含user / admin的值

显然,您不希望用户能够更新此值。从理论上讲,如果您使用上述代码,则有人可以在表单中注入新字段user_type并与其他表单数据一起发送“ admin”,并轻松地将其帐户切换为admin帐户...这是一个坏消息。

通过添加:

$fillable = ['name', 'password', 'email'];

您要确保只有这些值可以使用更新 mass assignment

为了能够更新user_type值,您需要在模型上显式设置并保存它,如下所示:

$user->user_type = 'admin';
$user->save();

16
感谢您提供此答案,我完全不知道谁会做这样的事情,例如$user = new User(Input::all());(作为程序员)不受控制(或者在什么情况下会有所帮助)。
Kyslik 2014年

14
……这根本不是答案,而是要保持答案简短,而不会劫持它,这是整个有关安全等方面的课程
Duellsy 2014年

3
我明白了,很高兴我找到了这个答案。我只是好奇上面(在我的评论中)引用的行在什么情况下有用。我的意思是没有验证以及所有这些东西。
Kyslik 2014年

4
因此您想回答一个题为“ Laravel中的“质量分配”是什么意思?”的问题 我应该详细介绍验证...这是对这个问题的简单回答,而不会偏离正轨。让我们保持原样。
dullllsy 2014年

8
我问的OP问题的意义不重要,因此我不必创建新线程,而您一直在谈论“为什么不这样”。我根本不明白为什么有人会像您写的那样使用行而不是$user = new User; $user->name = 'Neo';
Kyslik 2014年

25

批量分配是发送一次将要保存到指定模型的数据数组的过程。通常,您不需要一次一个地将数据保存在模型中,而只需一个过程即可。

批量分配是好的,但其背后存在某些安全问题。如果有人将值传递给模型并且没有保护,他们肯定可以修改包括ID在内的所有字段。这不好。

假设您有一个'students'表,其中的字段为“ student_type,first_name,last_name”。您可能想批量分配“ first_name,last_name”,但是您想保护Student_type避免直接更改,因此可填充和受保护

Fillable允许您指定模型中可批量分配的字段,可以通过向$fillable模型中添加特殊变量来实现。因此在模型中:

class Student extends Model {
      protected $fillable = ['first_name', 'last_name']; //only the field names inside the array can be mass-assign
} 

不包含“ student_type ”,这意味着它们被豁免。

保护是可填充的反面。如果fillable指定要批量分配的字段,则guarded指定不能批量分配的字段。因此在模型中:

class Student extends Model {
      protected $guarded = ['student_type']; //the field name inside the array is not mass-assignable
}

您应该使用$ fillable或$ guarded-不能同时使用。

有关更多详细信息,请打开链接:- 质量分配


1
这与Matt Stauffer的书“ Laravel Up&Running”完全吻合

5

批量分配意味着您要使用数据数组将多列填充为一行。(有点捷径而不是手动构建数组)Input::all()

从技术上讲,只是从我的头顶开始。Fillable表示允许插入表中的哪些列,guarded表示模型无法插入该特定列。

请注意,当您尝试使用like进行批量分配时,将其插入到名为“ secret”的列中,并且已指定该列为受保护对象,则可以尝试通过模型将其插入,但实际上永远不会将其插入数据库。

这是出于安全性和使用模型时对表的保护。大规模分配似乎只是一个通知或警告,您没有告诉模型可填充和受保护的模型,因此容易受到某种攻击。


2

这是将接收到的数据数组立即保存在模型中的时候。

由于laravel中此方法的安全性问题,建议您定义希望在模型上填充所需数据的字段。

您可以使用该$fillable变量来定义要在数据库表上填充的字段。

例如

Protected $fillable = [‘username’, dob’, email’,];

当laravel检测到您正在批量分配数据时,它将迫使您定义要在模型类中批量分配的字段。

有人可以轻松地将不需要的数据以html形式传递到您的数据库。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.