Laravelで「Mass Assignment」とはどういう意味ですか?


159

Eloquent ORMのトピック部分についてLaravel Documentを調べたところ、新しい用語が出ましたMass Assignment

ドキュメントには、大量の割り当てと行う方法を示しfillableまたはguardedプロパティの設定を。しかし、それを経験した後、私はそれがMass Assignmentどのように機能するかについて明確に理解していませんでした。

CodeIgniterでの私の過去の経験では、この用語についても聞いていません。

誰かそれについて簡単な説明がありますか?


回答:


206

一括割り当てとは、モデルの作成に配列を送信するときです。基本的には、次のように、モデルに一連のフィールドを1つずつではなく1回で設定します。

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

(これは、モデルの各値を個別に明示的に設定するのではありません。)

fillableこれを使用して、実際に更新を許可するフィールドを保護できます。

次のようにして、すべてのフィールドを一括割り当てできないようにすることもできます。

protected $guarded = ['*'];

userテーブルにuser_type、user / adminの値を持つことができるフィールドがあるとしましょう

もちろん、ユーザーがこの値を更新できないようにする必要があります。理論的には、上記のコードを使用すると、誰かがフォームに新しいフィールドを挿入user_typeし、他のフォームデータとともに「admin」を送信し、簡単に自分のアカウントを管理者アカウントに切り替えることができます...悪い知らせ。

追加することにより:

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

これらの値のみを使用して更新できることを確認しています mass assignment

user_type値を更新できるようにするには、次のようにモデルに明示的に設定して保存する必要があります。

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

16
この回答をありがとう、私は$user = new User(Input::all());(プログラマーとして)それがあまりにも制御されていない(またはどのシナリオでこれが役立つか)のようなことを誰が行うのかまったくわかりません。
Kyslik 14

14
...それは答えのすべてのポイントではありません、それはセキュリティなどの全体のレッスンとしてそれをハイジャックすることなく答えを短く保つことです
デュエルシー14

3
ポイントを得て、この答えを見つけてうれしい。上記の(私のコメントで)引用されている行がどのようなシナリオで役立つのか知りたいだけです。検証なしで、すべてのことを意味します。
Kyslik 2014

4
では、「Laravelでの「Mass Assignment」とはどういう意味ですか?」という質問に答えて考えます。検証について詳しく説明する必要があったのですが...それは問題から抜け出すことなく、質問に対する簡単な答えでした。これはそのままにしておきましょう。
duellsy 2014

8
私が尋ねたOPの質問の要点は問題ではないので、新しいスレッドを作成する必要はありません。あなたはそれについて「なぜ」話さないでください。あなたの代わりにそれを書いたように私は単純に、なぜ、誰かの使用ラインだろう理解していない$user = new User; $user->name = 'Neo';
Kyslik

25

一括割り当ては、指定されたモデルに一度に保存されるデータの配列を送信するプロセスです。一般に、モデルのデータを1つずつ保存する必要はなく、1つのプロセスで保存する必要があります。

一括割り当ては適切ですが、その背後にあるセキュリティ上の問題があります。誰かがモデルに値を渡し、保護がなければ、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 'は含まれていません。つまり、それらは免除されています。

Guardedは、fillableの逆です。fillableが一括割り当てされるフィールドを指定する場合、guardedは一括割り当て不可のフィールドを指定します。したがって、モデルでは:

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

$ fillableまたは$ guardedのどちらかを使用する必要があります。両方は使用しないでください。

詳細については、リンクを開いてください:- 一括割り当て


1
これは、マットシュタウファーの著書「Laravelアップ&実行」のまっすぐである
泡立て器

5

一括割り当てとは、データの配列を使用して、行に複数の列を入力することを意味します。(手動で配列を構築する代わりに、ショートカットの一部)を使用しInput::all()ます。

技術的には頭のてっぺんから。入力可能とは、テーブル内のどの列を挿入できるかを意味し、保護されているとは、モデルがその特定の列に挿入できないことを意味します。

likeを使用して一括割り当てを行おうとし、「secret」という名前の列に挿入し、それが保護されていることを指定した場合、モデルを介して挿入を試行できますが、実際には挿入されないことに注意してください。データベース。

これは、モデルを使用する際のセキュリティとテーブルの保護のためです。大量割り当ては、モデルに入力可能で保護されているものを通知せず、ある種の攻撃に対して脆弱になるという単なる通知または警告のようです。


2

これは、受信したデータの配列が一度にモデルに保存される場合です。

laravelのこのメソッドにはセキュリティの問題があるため、要求されたデータをモデルに入力するフィールドを定義することをお勧めします。

$fillable変数を使用して、データベーステーブルに入力するフィールドを定義できます。

例えば

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

laravelがデータを一括割り当てしていることを検出すると、モデルクラスで一括割り当てするフィールドを定義する必要があります。

誰かが不要なデータをHTMLフォームにデータベースに簡単に渡すことができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.