Laravel Resource Controller – Wie die Daten in die Datenbank kommen

19. Juni 2017 von Dirk Helbert in Laravel
Laravel Resource Controller

Immer öfter bekomme ich die Frage gestellt, wie Daten mit Laravel verwaltet werden können. Damit ist das klassische CRUD gemeint. (C)reate, (R)ead, (U)pdate und (D)elete. Oder ganz einfach: Daten erstellen, Daten anzeigen, Daten aktualisieren und Daten löschen. Das kann man mit einem Laravel Resource Controller wirklich super einfach machen. Ich zeige dir das hier anhand der Admin eines Mini Online Shops. Es gibt User und Produkte. Es wird keine grafischen Spielereien geben. Es geht alleine um die Daten. Nach dem Tutorial solltest du in der Lage sein deine Daten in Laravel zu verwalten.

In diesem Tutorial gehe ich davon aus, dass du bereits ein neues Laravel Projekt initialisiert hast. Falls du noch nie mit Laravel gearbeitet hast, dann schau dir mein Laravel Anfänger Tutorial an. Danach kannst du dann hier weiter machen. Auch die Datenbank sollte schon korrekt konfiguriert sein.

Das Tutorial basiert auf Laravel V5.4.26

Hol dir jetzt mein kostenloses E-Book
Geben Sie Ihre Email Adresse ein und klicken Sie auf den Knopf "Sofort Zugang erhalten".
Ich hasse Spam. Deine E-Mail wird nicht an Dritte weitergegeben oder verkauft.

Was lernst du hier

Neben dem Resource Controller Konzept von Laravel werde ich dir hier auch noch die Laravel Model Factories zeigen. Und du wirst sie lieben. Es vereinfacht die Entwicklung so ungemein. Doch dazu später mehr.

Die Url zu meinem lokalen Projekt heißt: http://minishop.dev/

Was wir brauchen

  1. User Model (existiert bereits nach der Installation)
  2. Produkt Model
  3. Produkt Model Factory
  4. Produkt Resource Controller
  5. Routen
  6. Diverse Views

Laravel Resource Controller erstellen

Ich initialisiere meine Projekte immer mit dem Standart Laravel Benutzersystem.

Das Schöne daran ist, dass ich jetzt bereits eine fertige Benutzer Registrierung und eine Login Möglichkeit habe.

Produkte Model, Controller und Migration

Damit wird das Model unter /app/Product.php, der Resource Controller unter /app/Http/Controllers/ProductController.php und die Datenbank Migration unter /database/migrations/XXX_XX_XX_XXXXXX_create_products_table.php angelegt. Der Resource Controller enthält schon die leeren Methoden, die wir gleich benötigen. Views werden aber noch nicht generiert.

Als nächstes bearbeite ich die Migration für das Produkt Model in /database/migrations/XXX_XX_XX_XXXXXX_create_products_table.php.

Die up() Methode sieht dann so aus

$table->unsignedInteger('user_id'); enthält die User Id des Erstellers. unsignedInteger bedeutet, dass es sich hier um einen positiven Integer Wert handelt. Die drei anderen hinzugefügten Zeilen sind der Name (name), die Beschreibung (description) und der Preis (price) des Produktes. Den Preis speichere ich grundsätzlich als Cent Preis.

Die Migration führen wir auf der Konsole aus

Product Model Factory

Model Factories in Laravel vereinfachen die Entwicklung enorm. In /database/factories/ModelFactory.php werden sogenannte Model Factories definiert. Das spannende daran ist, dass wir später damit Datenbankeinträge erzeugen können auf Grundlage von Faker. Also gefakete Daten. Das hat den Vorteil, dass wir so schnell Demo oder auch Test Daten erzeugen können.

Die Factory für unser Produkt sieht so aus

'user_id' => factory('App\User')->create()->id erzeugt aus der bereits existierenden User Factory einen neuen Benutzer und gibt die ID zurück.
'name' => $faker->word() erzeugt einen String, der hier den Produktnamen darstellen soll.
'description' => $faker->paragraph() erzeugt einen Text, der die Produktbeschreibung enthält.
'price' => $faker->randomNumber(4) erzeugt eine vierstellige Zufallszahl, die wir hier als Preis benutzen.

Um das mal zu testen, starte einfach auf der Konsole

Das ist ein Kommandozeilen Tool für Laravel.

Hier testen wir jetzt die Produkt Factory mit

Es erscheinen jetzt die 10 Einträge, die automatisch erzeugt wurden. Dafür sorgt das ->create(). 'App\Product', 10 sagt welches Model genutzt werden soll und wieviele Daten erzeugt werden.

Laravel Tinker Model Factory

App\User::all(); zeigt dir alle Benutzer an. Durch unsere Factory wurden hier auch 10 neue Benutzer erzeugt.

Eintrag Übersicht

Jetzt, da wir ein paar Produkte bereits in der Datenbank haben, können wir die auch mal anzeigen lassen.

In /routes/web.php füge ich eine neue Resource Route ein

Damit weiß Laravel, dass alles was mit /admin/route anfängt zum ProductController gehört.

In /app/Http/Controllers/ProductController.php fülle ich die index() Methode mit

Hier werden alle Produkte geholt und an die View admin.product.index übergeben.

Die View erzeugen wir in /resources/views/admin/product/index.blade.php

Du kannst jetzt schon http://minishop.dev/admin/product die Seite aufrufen und solltest Produkte sehen. Ganz schlicht gehalten, aber du erkennst schon wie einfach das ist.Laravel CRUD

Neuen Eintrag anlegen (C)reate

Wie das Erstellen neuer Einträge über die Model Factory funktioniert, hast du gesehen. Wie du über ein Formular neue Produkte erzeugen kannst, siehst du im nächsten Schritt. Hier ziehe ich das Tempo etwas an. Wenn du Fragen dazu hast, dann hinterlass einfach einen Kommentar.

/app/Http/Controllers/ProductController.php Methode create()

View /resources/views/admin/product/create.blade.php

Alles von @if($errors->any()) bis zum @endif wird für die Fehleranzeige benötigt. Das kann man auch ganz gut auslagern und dann später in jeder View anzeigen lassen die Fehlermeldungen ausgibt. Oder man packt es ins Layout. Damit es einfacher ist, lasse ich es hier in der View. {{ old('name') }} sorgt dafür, dass bei einer fehlerhaften Validierung hier die eingegebenen Daten wieder zu sehen sind. Gerade bei längeren Formularen nervt es, wenn man alles wieder neu eingeben muss.

Danach wird dann das Formular erzeugt. Hier füge ich gerne das HTML5 Tag required hinzu, wenn eine Eingabe erforderlich ist. Hier sollte man sich aber nicht darauf verlassen. Eine serverseitige Validierung der Daten ist auf jeden Fall notwendig.

Jetzt muss das Ganze natürlich noch in der Datenbank gespeichert werden. Das geschieht in der store() Methode in /app/Http/Controllers/ProductController.php

Als erstes werden hier die Eingaben validiert. Ganz stumpf einfach ob der Name (name), die Beschreibung (description) und der Preis (price) eingegeben wurde und ob der Preis eine Integer Zahl ist. Ist das nicht der Fall, macht Laravel automatisch einen Redirect auf das Formular und führt den Code unter der Validierung gar nicht erst aus. Auch die Fehlermeldungen werden automatisch übergeben und dann in der View wieder ausgegeben. Sehr nice.

Falls die Validierung durchläuft, also die Daten korrekt sind, erzeugen wir ein neues Product Objekt. Das befüllen wir hier mit den Request Daten mit der Laravel Helfer Funktion request(). $product->user_id = auth()->id(); hier holen wir die ID von dem eingeloggten Benutzer. Mit $product->save(); speichern wir die Daten in die Datenbank. return redirect('/admin/product'); führt zurück auf die Produkt Übersicht.

Damit man gar nicht erst Produkte erstellen kann ohne eingeloggt zu sein, fügen wir in /app/Http/Controllers/ProductController.php noch im Konstruktor die Auth Middleware ein.

Von nun an, sind alle Routen die auf den ProductController enden geschützt und verlangen einen Login. In diesem Beispiel ist das aber nur ein ganz einfacher Schutz. Hier wird nur der Login (Authentication) und nicht die Zugriffsberechtigung (Authorisation) geprüft. Aber für jetzt reicht uns das erstmal.

Dann kannst du jetzt mal auf http://minishop.dev/admin/product/create gehen ein neues Produkt anlegen.

Hat es geklappt? Prima!

Eintrag anzeigen (R)ead

Als nächstes zeigen wir ein Produkt im Detail an. In einem Resource Controller übernimmt das die show() Methode.

/app/Http/Controllers/ProductController.php

Hier ist schon ein bisschen „Magic“ drin. Mit show(Product $product) wird hier schon das richtige Produkt Objekt für uns geholt. Da müssen wir uns gar nicht drum kümmern. Wenn man sich an gewisse Konventionen von Laravel hält, kann man das die ganze Anwendung hindurch so einfach nutzen. Das Produkt Objekt übergeben wir dann an die View.

/resources/views/admin/product/show.blade.php

Das Aufruf eines einzelnen Produktes erfolgt über http://minishop.dev/admin/product/1

Also (C)reate haben wir, (R)ead auch. Fehlt noch (U)pdate und (D)delete. Auch das ist keine Zauberei.

Eintrag aktualisieren (U)pdate

Das Formular um ein Produkt zu ändern sieht ähnlich aus wie das Formular um ein Produkt zu erstellen. Du kannst später noch die Teile auslagern, die gleich sind.

/app/Http/Controllers/ProductController.php edit() Methode

Auch hier ist wieder die „Magic“ drin und wir übergeben das Produkt Objekt an die View.

/resources/views/admin/product/edit.blade.php

Neu ist hier unter anderem

. Das ist die Route für das Update. Im CRUD ist das Update eigentlich ein PUT. Nur funktioniert das in HTML nicht. Daher wird das von Laravel mit {{ method_field('PUT') }} simuliert. Die Formularfelder werden mit value="{{ $product->name }}" vorbelegt.

Das aktualisieren erfolgt in der update() Methode.

/app/Http/Controllers/ProductController.php

Das ist jetzt ähnlich der store() Methode weiter oben. Auch hier erfolgt die Validierung. Das könnte man sicher noch auslagern um keinen doppelten Code zu erzeugen. Danach wird das bereits injizierte Produkt Objekt mit den neuen Daten befüllt und gespeichert. Die user_id wird hier nicht neu vergeben, da sich der Ersteller des Produkts ja nicht geändert hat. Danach folgt wieder der Redirekt auf die Produkt Übersicht.

Du kannst das ganz einfach unter http://minishop.dev/admin/product/1/edit testen.

Eintrag löschen (D)elete

Das löschen eines Eintrags mit Laravel ist etwas komplizierter, als es sich anhört. Laravel hält sich hier strikt an die RESTful Methodik. Das ist aber nicht weiter schlimm, solange man das weiß.

Wir passen daher jetzt unsere Produkt Übersichts Seite etwas an.

Auszug aus /resources/views/admin/product/index.blade.php

Neu ist hier, dass für jeden einzelnen Eintrag ein Mini Formular mit einem Button erzeugt wird. Außerdem wird ein Hidden Field mit einer Pseudo Methode DELETE eingefügt.

Entsprechend einfach ist die Methode destroy() in /app/Http/Controllers/ProductController.php

Ist das nicht einfach?

Fazit

Damit sind wir am Ende des Laravel CRUD Tutorials. Du hast gelernt wie einfach es ist mit Laravel Daten in die Datenbank zu bekommen. Sicherlich gibt es einige Verbesserungsmöglichkeiten. Aber genau hier kommst du dann ist Spiel. Du wirst deine eigenen Erfahrungen machen und auch auf Probleme und Fragen stossen. Daher wäre es super, wenn du hier einen Kommentar hinterlassen würdest. Ich freue mich darauf.

Und falls du immer noch nicht genug von Laravel hast, dann hol dir doch einfach mein kostenloses Laravel Anfänger Tutorial E-Book.

Hol dir jetzt mein kostenloses E-Book
Geben Sie Ihre Email Adresse ein und klicken Sie auf den Knopf "Sofort Zugang erhalten".
Ich hasse Spam. Deine E-Mail wird nicht an Dritte weitergegeben oder verkauft.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.