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


Larvel withCount mit Where Condition

November 18, 2021

Stellt Euch vor ihr habt ein Model Post mit einer Relation Comment. Auf der Übersichtsseite von Post möchtet ihr nur die Anzahl der Kommentare eines jeweiligen Post anzeigen. Dafür gibt es die echt hilfreiche Laravel Funktion withCount(). Post::withCount(‘comments’)->all(); Aber bei Comments kann es ja sein, dass manchen noch approved werden müssen. Diese müssen dann noch […]

Laravel Mailhog Docker

October 20, 2021

Letztens wurde ich gefragt, wie ich Mail bei Laravel teste. Ich meinte ich habe einen SMTP Server den ich nutzen kann. Da meinte er, dass wäre zwar okay aber man könnte sich damit auch eine valide Mailadresse verbrennen. Mit verbrennen meint der Kollege, dass sie global als SPAM Mailadresse angerechnet werden kann. Falls die Tests […]

Meine wichtigsten Artisan Commands

September 6, 2021

Als Laravel Entwickler braucht man sie ständig. Wenn man etwas länger Frontendarbeiten gemacht hat, kommt es schon mal vor, dass man etwas vergessen hat. Daher hier die Liste mit den häufigsten Artisan Commands: php artisan migrate:rollback –step=1 Ihr wollte eine oder x-beliebige Migrationen zurückspulen? Dann rollback und die Anzahl der Migrationssteps eingeben. php artisan migrate:refresh […]

Laravel – Slugs einrichten

September 2, 2021

Slugs machen die URLs Sprechender und damit auch SEO-(Freund)licher. Statt domain.de/posts/1 würde man mit domain.de/posts/mein-erster-blog-eintrag arbeiten. Um das in Laravel zu realisieren, bedient man sich in der Regel externer Bibliotheken. Einmal eine von Spartie und eine cviebrock. Man kann es natürlich aber auch selber machen. Die Bibliotheken sind hier aber vorzuziehen. Weil es ist keine […]

Laravel Blade Components

August 27, 2021

Componets – Aus VueJS kennen wir es und haben es bereits lieben gelernt. In Laravel können wir im Blade auch sehr dynamisch in Componenten arbeiten. Von Hause gibt uns Laravel Componets mit. Am Beispiel erklärt Stellen wir uns vor, wir wollen ein Blog erstellen. In der Übersichtsseite, sollen die Blogartikel untereinander gelistet werden. Wer ohne […]

Laravel Resource – Kurz mal erklärt

August 26, 2021

Nutzen wir zum Beispiel Larvel als Backend und beliefern das Frontend via api Route mit Daten, dann stellt sich manchmal die Frage, welche Daten braucht das Frontend eigentlich? Braucht man wirklich created_at oder updated_at mit auszuliefern? Sobald man sich so eine oder ähnliche Frage stellt wird es Zeit sich mal mit Laravel Resource auseinander zu […]