"质量分配"在Laravel中意味着什么?

Che*_*Lin 135 php mass-assignment laravel

当我通过Laravel文档了解Eloquent ORM主题部分时,我得到了一个新术语Mass Assignment.

文档显示如何进行质量分配和fillableguarded属性设置.但经过这一切,我没有清楚地了解Mass Assignment它是如何工作的.

在我过去的CodeIgniter经历中,我也没有听说过这个术语.

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

due*_*lsy 182

质量赋值是指您将数组发送到模型创建时,基本上在模型中设置一堆字段,而不是逐个,例如:

$user = new User(Input::all());
Run Code Online (Sandbox Code Playgroud)

(这不是单独显式设置模型上的每个值.)

您可以使用它fillable来保护您希望实际允许更新的字段.

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

显然,您不希望用户能够更新此值.从理论上讲,如果你使用上面的代码,有人可以在表单中注入一个新字段user_type,并将"admin"与其他表单数据一起发送,并轻松将其帐户切换到管理员帐户...坏消息.

通过增加:

$fillable = array('name', 'password', 'email');
Run Code Online (Sandbox Code Playgroud)

您确保只能使用更新这些值 mass assignment

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

$user->user_type = 'admin';
$user->save();
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你的回答,我完全不明白谁会做`$ user = new User(Input :: all());`(作为程序员)它是如此不受控制(或者在什么情况下会有用) . (13认同)
  • ...这根本不是答案的答案,是为了保持答案的简短而不是劫持它作为整个安全课等 (10认同)
  • 我提出的OP问题的重点是什么并不重要,所以我不必创建新的线程,你一直在谈论"为什么不"谈论它.我根本不明白为什么有人会在你编写它时使用line而不是`$ user = new User; $ user-> name ='Neo';` (6认同)
  • 我明白了,我很高兴找到了答案.我只是好奇上面引用的行(在我的评论中)有用.我的意思是没有验证和所有这些东西. (3认同)
  • 所以你想回答一个题为'什么做'质量分配"的问题在Laravel中意味着什么?我应该详细了解验证......这是一个简单的答案,而不会偏离轨道.让我们保持原样. (3认同)
  • @Kyslik,可以使用“User(Input:all)”来编写更短的代码,使其更具可读性且更易于维护。如果你相应地设置了警卫,那么根本就不存在安全风险。 (2认同)
  • @KeitelJovin 是的,现在,当使用 FormRequest 时(在您的示例中您不这样做),您可以使用 `$request->all()` 因为只有 **validated** 字段会出现。而且它已经有 4 年历史了,我可能会说现在已经过时了...... (2认同)

Udh*_*iya 22

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

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

假设您有'学生'表,其字段为"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
} 
Run Code Online (Sandbox Code Playgroud)

' student_type '不包括在内,这意味着它们被免除.

守卫是可填写的逆转.如果fillable指定要批量分配的字段,则guarded指定哪些字段不可批量分配.所以在模型中:

class Student extends Model {
      protected $guarded = ['student_type']; //the field name inside the array is not mass-assignable
}
Run Code Online (Sandbox Code Playgroud)

你应该使用$ fillable或$ guarded - 而不是两者.

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

  • 这直接出自 Matt Stauffer 的书“Laravel Up & Running” (3认同)

maj*_*rif 5

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

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

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

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