Route Model Binding in Laravel 5

Ein sehr zeitsparendes Feature in Laravel sind die sogenannten Route Model Bindings. Das bedeutet nichts anderes als dass wir Laravel mitteile:

Wenn ich diesen Parameter in einer Route verwende, instanzier mir bitte das dazu gehörige Eloquent Model und lies die Daten dazu aus der Datenbank aus.

Das resultierende Objekt bekommen wir dann in unsere Controllermethode übergeben. In diesem Artikel möchte ich einen Überblick über Route Model Binding geben und wir sehen uns ein paar weniger bekannte Möglichkeiten dazu an.

Die Welt ohne Route Model Binding

Folgendes Beispiel ist sehr häufig bei der Entwicklung einer Website oder Webapplication vertreten:

Wir übergeben also eine ID an die Route und anhand dieser ID lesen wir innerhalb des Controllers das passende Model aus (oder werfen eine Exception falls es diese ID nicht gibt). Das ist bei einem oder zwei Fällen auch kein Problem, müssen wir das nun aber zehn oder zwanzig mal machen wird es schnell langweilig und unnötiger Aufwand.

 

Route Model Binding to the rescue

Und genau an dieser Stelle setzt das Route Model Binding jetzt ein.

Beide Beispiele erreichen das gleiche Ziel – wird in einer Route ab sofort der Parameter product gefunden wird dieser automatisch durch ein Objekt unseres Models ersetzt. Der Vorteil an der zweiten Variante ist, dass wir die Logik zum Auslesen des Objekts selbst bestimmen können.
Wir könnten also beispielsweise mit mehreren where() Bedingungen nur aktive Produkte oder vielleicht nur reduzierte Produkte einbeziehen.

Auf Controllerseite bleibt alles gleich, der einzige Unterschied liegt darin, dass unser Parameter $product direkt ein Objekt enthält anstatt eine ID.

 

 

Route Key eines Models ändern

In Matt Stauffers Blogpost zu diesem Thema bin ich auf einen nützlichen Trick aufmerksam geworden. Wir stellen uns folgendes Szenario vor:

Unser Blogsystem hat Beiträge. Beiträge werden – für schönere URLs – immer mit einem Slug angesprochen. Ein Beispiel für so einen Slug wäre http://mein-toller-blog.de/neuer-blogpost. Da die Zuweisung immer über dieses Slug erfolgt wäre es wiederum ziemlich umständlich, die Logik dafür zu ändern. Standardmäßig verwenden die Route Model Bindings allerdings die ID eines Datensatzes.

Dieses Verhalten kann man für ein Model allerdings ganz leicht ändern, indem man die Methode getRouteKeyName() im Model überschreibt.

Standardmäßig gibt diese Methode id zurück. Wenn wir einen anderen Wert zurückgeben wird Laravel ab sofort den Datensatz anhand dieser Spalte in der Datenbank auslesen und wir hätten unser Problem ganz einfach mit nur drei Zeilen gelöst und uns wieder etwas Arbeit gespart.

 

 

Laravel 5.2: Implizites Route Model Binding

Ein neues Feature in Laravel 5.2 ist das implizite Route Model Binding. Das heißt nichts anderes, als dass wir uns in einfachen Fällen sogar die ganze Deklaration sparen können und einfach nur noch per TypeHint festlegen, welche Klasse verwendet werden soll.

Wie wir sehen müssen wir uns um quasi nichts mehr kümmern. Die einzige Bedingung dafür ist der TypeHint in der Methode und dass der Parameter in der Route (also das {product}) denselben Namen wie der Parameter in der Methode (also $product) hat. Daran erkennt Laravel 5.2 was wir wollen. Wieder ein tolles Beispiel dafür, wie Laravel uns die Entwicklung Schritt für Schritt einfacher macht.

 

Hast du noch mehr Tricks zum Thema Route Model Binding auf Lager? Ich freue mich auf deinen Kommentar unter dem Artikel.

Schreibe einen Kommentar

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

*