Was bedeutet "Massenauftrag" in Laravel?

159

Als ich das Laravel-Dokument zum Thema Eloquent ORM durchgesehen habe, habe ich einen neuen Begriff erhalten Mass Assignment.

Dokument zeigen, wie die Massenzuweisung durchgeführt wird, und die Einstellungen fillableoder guardedEigenschaften. Aber nachdem ich das durchgemacht hatte, hatte ich kein klares Verständnis dafür Mass Assignmentund wie es funktioniert.

In meiner bisherigen Erfahrung mit CodeIgniter habe ich auch nichts von diesem Begriff gehört.

Hat jemand eine einfache Erklärung dafür?

Chen-Tsu Lin
quelle

Antworten:

206

Die Massenzuweisung erfolgt, wenn Sie ein Array an die Modellerstellung senden und im Grunde genommen eine Reihe von Feldern auf dem Modell in einem einzigen Durchgang anstatt nacheinander festlegen.

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

(Dies bedeutet, dass nicht explizit jeder Wert im Modell separat festgelegt wird.)

Sie können fillabledamit schützen, welche Felder tatsächlich aktualisiert werden sollen.

Sie können auch verhindern, dass alle Felder massenzuweisbar sind, indem Sie Folgendes tun:

protected $guarded = ['*'];

Angenommen, Sie haben in Ihrer Benutzertabelle ein Feld, user_typedas die Werte user / admin enthalten kann

Natürlich möchten Sie nicht, dass Benutzer diesen Wert aktualisieren können. Wenn Sie den obigen Code verwenden, könnte jemand theoretisch ein neues Feld in ein Formular einfügen user_typeund 'admin' zusammen mit den anderen Formulardaten senden und sein Konto einfach auf ein Administratorkonto umstellen ... schlechte Nachrichten.

Beim Hinzufügen:

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

Sie stellen sicher, dass nur diese Werte mit aktualisiert werden können mass assignment

Um den user_typeWert aktualisieren zu können , müssen Sie ihn explizit für das Modell festlegen und wie folgt speichern:

$user->user_type = 'admin';
$user->save();
duellsy
quelle
16
Vielen Dank für diese Antwort, ich verstehe nicht, wer so etwas tun würde $user = new User(Input::all());(als Programmierer), dass es so unkontrolliert ist (oder in welchem ​​Szenario wäre dies hilfreich).
Kyslik
14
... es ist überhaupt nicht der Punkt der Antwort, es ist, die Antwort kurz zu halten, ohne sie als ganze Lektion über Sicherheit usw. zu
entführen
3
Ich habe es verstanden und bin froh, diese Antwort gefunden zu haben. Ich bin nur neugierig, in welchem ​​Szenario die oben zitierte Zeile (in meinem Kommentar) nützlich ist. Ich meine ohne Bestätigung und all das Zeug herum.
Kyslik
4
Sie denken also als Antwort auf eine Frage mit dem Titel "Was bedeutet" Massenauftrag "in Laravel?" Ich hätte näher auf die Validierung eingehen sollen ... es war eine einfache Antwort auf die Frage, ohne aus der Spur zu geraten. Lassen wir das so wie es ist.
Duellsy
8
Es spielt keine Rolle, worum es bei der OP-Frage geht, die ich gestellt habe, damit ich keinen neuen Thread erstellen muss, und Sie sprechen immer wieder darüber, warum nicht. Ich verstehe einfach nicht, warum jemand Zeile verwenden sollte, wie Sie es geschrieben haben, anstatt$user = new User; $user->name = 'Neo';
Kyslik
25

Bei der Massenzuweisung wird ein Array von Daten gesendet, die sofort im angegebenen Modell gespeichert werden. Im Allgemeinen müssen Sie die Daten Ihres Modells nicht einzeln speichern, sondern in einem einzigen Prozess.

Die Massenzuweisung ist gut, aber es gibt bestimmte Sicherheitsprobleme. Was ist, wenn jemand einen Wert an das Modell übergibt und ohne Schutz definitiv alle Felder einschließlich der ID ändern kann? Das ist nicht gut.

Angenommen, Sie haben eine ' Schülertabelle ' mit den Feldern "Schülertyp, Vorname, Nachname" . Sie möchten möglicherweise "Vorname, Nachname" massenweise zuweisen, aber Sie möchten den Schülertyp vor einer direkten Änderung schützen . Hier finden ausfüllbare und geschützte statt.

Mit Fillable können Sie angeben, welche Felder in Ihrem Modell massenzuweisbar sind. Sie können dies tun, indem Sie $fillabledem Modell die spezielle Variable hinzufügen . Also im Modell:

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

Der ' student_type ' ist nicht enthalten, was bedeutet, dass sie ausgenommen sind.

Geschützt ist die Rückseite von füllbar. Wenn ausfüllbar angibt, welche Felder massenweise zugewiesen werden sollen, gibt bewacht an, welche Felder nicht massenzuweisbar sind. Also im Modell:

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

Sie sollten entweder $ fillable oder $ guarded verwenden - nicht beide.

Für weitere Details öffnen Sie den Link: - Massenzuweisung

Udhav Sarvaiya
quelle
1
Dies ist direkt aus Matt Stauffers Buch "Laravel Up & Running"
Schneebesen
5

Massenzuweisung bedeutet, dass Sie eine Zeile mit mehr als einer Spalte unter Verwendung eines Datenarrays füllen. (eine Art Verknüpfung, anstatt das Array manuell zu erstellen) using Input::all().

Technisch gesehen nur von oben. Füllbar bedeutet, welche Spalten in der Tabelle eingefügt werden dürfen. Geschützt bedeutet, dass das Modell nicht in diese bestimmte Spalte eingefügt werden kann.

Beachten Sie, dass Sie, wenn Sie versuchen, eine Massenzuweisung mit like durchzuführen, in eine Spalte mit dem Namen "secret" einfügen und angegeben haben, dass sie geschützt ist, versuchen können, sie über das Modell einzufügen, sie wird jedoch nie wirklich eingefügt die Datenbank.

Dies dient der Sicherheit und dem Schutz Ihres Tisches bei Verwendung des Modells. Die Massenzuweisung scheint nur ein Hinweis oder eine Warnung zu sein, dass Sie dem Modell nicht mitgeteilt haben, welche ausfüllbar und geschützt sind, und dass es für Angriffe anfällig ist.

Majidarif
quelle
2

In diesem Fall wird ein Array empfangener Daten gleichzeitig in einem Modell gespeichert.

Aufgrund der Sicherheitsprobleme mit dieser Methode in Laravel wird empfohlen, die Felder zu definieren, in die die angeforderten Daten im Modell eingefügt werden sollen.

Mit der $fillableVariablen können Sie die Felder definieren, die Sie in die Datenbanktabelle einfügen möchten.

Z.B

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

Wenn Laravel feststellt, dass Sie Daten zuweisen, müssen Sie die Felder definieren, die Sie in der Modellklasse massenweise zuweisen möchten.

Jemand kann leicht unerwünschte Daten in ein HTML-Formular an Ihre Datenbank übergeben.

Punit khandelwal
quelle