Laravel Mass Assignment – kurz erklärt

Jeder der mit Laravel und einer Datenbank arbeitet kommt zwangsläufig auf das Thema Mass Assignment. Was ist das eigentlich?

Beziehungsweise ihr kennt diese HTTP 500 Fehlermeldung:
Add [name] to fillable property to allow mass assignment on [App\Models\Profil].

Stellen wir uns vor wir haben eine Website mit einem geschütztem Dashboard für unsere Nutzer. Ein registrierter Nutzer kann unter anderem sein Profil bearbeiten. Beispielsweise: Email, Vorname, Nachname, Strasse usw. Stellen wir uns weiter vor, dass wir in unserer Applikation dem Nutzer verschiedene Rollen zuweisen können. Zum Beispiel Premiumnutzer, Admin oder ähnliches.

Wenn der Nutzer über ein Formular sein Profil bearbeitet und an das Backend abschickt passiert dann folgender Ablauf. Im Backend Controller wird der Request entgegengenommen. Zum Beispiel:

public function update_profil(Request $request) {
	$id = $request->input('id');
	$name = $request->input('name');
	$street = $request->input('street');
	$email = $request->input('email');	

	// oder einfach mit:  
	$alleDaten = $request->all(); 

	// Dann werden die Daten zum Model weitergeben. 
	$profil = Profil::find($id);
	$profil->name = $alleDaten['name'];
	$profil->street = $alleDaten['street'];
	$profil->email = $alleDaten['email'];
	$profil->save();  
}

Das wars! Dieser Weg ist gut aber bei mehreren Feldern auch mühselig. Weil man noch Validierungen, Plausibilitäten usw. vornehmen muss. Eine einfache Alternative wäre das ganze Request Array ( $request->all() ) am Stück dem Model Profil zu übergeben. Man nennt das auch Mass Update. Quasi so :

Profil::where('id', 1)->update( $request->all() );
// oder: 
$profil = Profil::find($id);
$profil->update( $request->all() ); 

Was kann aber nun ein Bösewicht hier böses machen? Genau er kann versuchen den – nennen wir die Datenbankspalte mal – user_type in das Formular mit dem value „admin“ einschleusen. Nicht gut, wenn wir nun über ein unvalidiertes Mass Assignment die Daten updaten. Kommt öfters vor als man denkt. Deshalb ist es wichtig das Konzept der fillable und guarded Spalten im Model zu verstehen und auch überlegt anzuwenden.

Genau aus diesem Grund gibt es im Model auch die protected Klassenvariablen $fillable und $guarded .

fillable()

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

Hier trägst Du ein welche Felder so geupdatet werden dürfen. Felder die nicht im fillable Array stehen werden auch nicht berücksichtigt.

guarded()

Die Model Klassenvariable $guarded ist genau das gegenteil von fillable. Hier schreibst du die Spaltennamen rein, die nicht geupdated werden dürfen. Also in unserem Fall user_type.

Man kann auch sagen, fillable ist eine whitelist und guarded eine blacklist. Beides braucht man nicht. Entscheidet einfach selbst welchen Ansatz ihr verfolgt.

Wichtig ist zu wissen, sobald man mit Mass assignment oder mass update arbeitet die fillable bzw. guarded zu setzen.

Möchte man das alle Felder erlaubt sind, dann muss man nicht extra alle Felder in fillable einfüge sondern kann einfach:

protected $guarded = []

und ohne viel Schreiberei das lösen.


Leave a Comment

Your email address will not be published. Required fields are marked *

*

*

Empfholende Artikel


Laravel Test möglicher Fehler – Unknown formatter “name”

April 17, 2021

Falls Du gerade Dein Test geschrieben hast und du deinen Test mit php artisan test startest kann es sein, dass Du folgende Fehlermeldung erhalten kannst: Was ist passiert? Wahrscheinlich hast Du in deiner seUp() Methode oder in deiner Testfunktion ein factory eingebaut. Zum Beispiel Da Laravel einige Optimierungen vorgenommen hat, kannst Du nicht die Standard […]

Eine einzelne Migration in Laravel ausführen

March 25, 2021

Aus unterschiedlichen Gründen kann es sein, dass man in einem Laravel Projekt eine spezielle Migration ausführen möchte. Zum Beispiel die zuletzt erstellte Migration. Ein anscheinend häufiger Grund für dieses Vorgehen könnte sein, dass in einer vorherigen Migrationsdatei ein Fehler auftreten würde. Und da Laravel die Migrationsdateien von der ältestesten zur jüngsten Migration abarbeitet, würde man […]

Laravel Faker – Kurz mal erklärt

March 6, 2021

Alle nutzen anscheint Faker. Es gab mal einen ehemaligen US Präsidenten der meinte die Washington Post verbreitet Fake(r) News. Er selbest wiederum hatte sich eine Faker API in sein damals noch nicht gesperrten Twitter Account reinlegen lassen. Fakes sind in der Geschichte der Menschheit immer präsent gewesen und nicht erst seit 2016. Aber zurück zum […]

Laravel – Service, Repository Pattern

February 6, 2021

Ein wichtiger Baustein der Softwareentwicklung ist die Softwarearchitektur. Ab einer bestimmten Größe steht und fällt, meines Erachtens, ein Projekt mit der Softwarearchitektur. Damit ist nicht gemeint, das prozedural geschriebener Code perse schlecht ist. Im Gegenteil. In der Vergangenheit habe ich mit prozedural geschriebenen Code gute Software gebaut die teilweise bis heute läuft. Ich erinnere mich […]

Laravel Model kurz mal erklärt

January 26, 2021

Heute mal leichte Kost. Laravel Model. Was ist das und was stellt man damit an, wie erstellt man ein Model und was kann es so alles. Genug der langen Worte, fangen wir an! Was ist ein Model? Dafür blicken wir auf ein DesignPattern der Programmierung und zwar dem MVC Muster. MVC steht für Model, View […]

JWT in Laravel einrichten – Kurz mal erklärt

January 19, 2021

Ein sehr großes Topic vor beginn einer neuen Applikation ist die Authentifizierung. Bei der Hypoport AG in Berlin wurde bei einem Projekt ein ganzer Monat mit mehreren Entwicklerteams das Thema Login geplant. In anderen Projekten, die sicher laufen sollen, verhält sich das ähnlich. Deswegen sollte das Thema von Anfang an immer gut durchdacht sein. Erspart […]