Das Repository-Muster in Laravel 5

Das Repository-Muster wurde zum ersten Mal von Eric Evans in seinem Buch Domain-Driven Design eingeführt. Das Repository ist tatsächlich der Einstiegspunkt für die Anwendung Zugriff auf die Domain Schicht.

Vereinfacht gesagt, erlaubt das Repository Ihrem gesamten Code die Verwendung von Objekten, ohne dass Sie wissen müssen, wie die Objekte persistent sind. Das Repository enthält alle Kenntnisse über Persistenz, einschließlich der Zuordnung von Tabellen zu Objekten. Dies bietet eine objektorientiertere Ansicht der Persistenzschicht und macht den Mapping-Code stärker gekapselt.

Die einzige Möglichkeit, um Ihre Repositories in Laravel zum Laufen zu bringen (als echtes Repository - Eric Evans Buch mit Domänengetriebenes Design), besteht darin, den Standard-ORM vom aktiven Datensatz in den Data Mapper zu ändern. Der beste Ersatz ist Doctrine.

Die Lehre ORM

Doctrine ist ein ORM (objektrelationales Mapping), das das Data-Mapper-Muster implementiert und die saubere Trennung der Geschäftsregeln der Anwendung von der Persistenzschicht der Datenbank ermöglicht. Doctrine verwendet DQL anstelle von SQL. DQL bietet Ihnen Objektabfragesprache, was bedeutet, dass Sie anstelle eines herkömmlichen relationalen Abfragebegriffs Abfragen im Objektterm hätten.

Sie können die Datenbankabfragen objektorientiert schreiben und hilft, die Datenbank auf eine Weise abzufragen, die mit den Standard-Repository-Methoden nicht erreicht werden kann. Meiner Meinung nach ist DQL der effektivste Weg, um mit Ihrer Datenbank in Kontakt zu bleiben.

Lehre vs. Eloquent

Doctrine-Entitäten sind nur eine einfache einfache PHP-Klasse und erhöhen den ORM-Vererbung nicht. Doctrine verwaltet Ihre mehrfachen Abfragen mit derselben Vererbung, ohne die Datenbank zu treffen. Dies bedeutet, dass das Entitätsobjekt für die gesamte Anforderung vorhanden ist.

Die andere nette Funktion von Doctrine ist, dass anstelle der Migration von Dateien zum Erstellen des Datenbankschemas die Datenbank automatisch erstellt wird, um die Metadaten in den Entitätsanmerkungen widerzuspiegeln. Auf der anderen Seite ist Eloquent weniger kompliziert und sehr einfach zu bedienen.

Ein vollständiger Vergleich zwischen diesen beiden würde einen separaten Artikel erfordern. Wie Sie sehen können, ist ein Doctrine-Objekt leichter und abstrakter. Doctrine wird jedoch nur für bestimmte Projekte passen, sodass Sie manchmal Overhead haben. Ich glaube, es hängt vom Programmierer ab, den besten ORM für die App auszuwählen.

Die Blog-App

Nun ist es an der Zeit, eine Blog-App mit Laravel zu erstellen. Zunächst müssen wir die Lehre aufstellen. Es gibt eine Brücke, die eine Anpassung an die vorhandene Konfiguration von Laravel 5 ermöglicht. Um Doctrine 2 in unserem Laravel-Projekt zu installieren, führen wir den folgenden Befehl aus:

Bash-Komponist benötigt Laravel-Doktrin / Orm

Wie üblich sollte das Paket dem hinzugefügt werden app / config.php , als Dienstleister:

PHP LaravelDoctrine \ ORM \ DoctrineServiceProvider :: Klasse,

Der Alias ​​sollte auch konfiguriert werden:

php 'EntityManager' => LaravelDoctrine \ ORM \ Facades \ EntityManager :: Klasse

Zum Schluss veröffentlichen wir die Paketkonfiguration mit:

bash php handwerker hersteller: publish --tag = "config"

Jetzt sind wir hier fertig.

Entitäten sind wichtige Teile der App App \ Entities \ Post.php:

"php

Namensraum App \ Entity;

Doctrine \ ORM \ Mapping als ORM verwenden;

/ ** * @ORM \ Entity * @ORM \ Table (name = "posts") * @ORM \ HasLifecycleCallbacks () * / class Post / ** * @var Integer $ id * @ORM \ Spalte (name = ") id ”, type =” integer ”, unique = true, nullable = false) * @ORM \ Id * @ORM \ GeneratedValue (Strategie =” AUTO ”) * * / private $ id;

/ ** * @ORM \ Column (type = "string") * / private $ title; / ** * @ORM \ Column (type = "text") * / private $ body; öffentliche Funktion __construct ($ input) $ this-> setTitle ($ input ['title']); $ this-> setBody ($ input ['body']);  public function setId ($ id) return $ this-> id = $ id;  public function getId () return $ this-> id;  public function getTitle () return $ this-> title;  public function setTitle ($ title) $ this-> title = $ title;  public function getBody () return $ this-> body;  public function setBody ($ body) $ this-> body = $ body;  "

Jetzt ist es an der Zeit, das zu erstellen Repository, das wurde früher beschrieben. App / Repositories / PostRepo.php :

"PHP-Namensraum App \ Repository;

benutze App \ Entity \ Post; Verwenden Sie Doctrine \ ORM \ EntityManager. Klasse PostRepo

/ ** * @var string * / private $ class = 'App \ Entity \ Post'; / ** * @var EntityManager * / private $ em; öffentliche Funktion __construct (EntityManager $ em) $ this-> em = $ em;  public function create (Post $ post) $ this-> em-> persist ($ post); $ this-> em-> flush ();  public function update (Post $ post, $ data) $ post-> setTitle ($ data ['title']); $ post-> setBody ($ data ['body']); $ this-> em-> persist ($ post); $ this-> em-> flush ();  public function PostOfId ($ id) return $ this-> em-> getRepository ($ this-> class) -> findOneBy (['id' => $ id]);  öffentliche Funktion delete (Post $ post) $ this-> em-> remove ($ post); $ this-> em-> flush ();  / ** * Post erstellen * @return Post * / private Funktion perpareData ($ data) neuen Post zurückgeben ($ data);  

"

Der Controller: App / HTTP / Controller / PostController.php :

"php namespace App \ Http \ Controllers; benutze App \ Repository \ PostRepo als Repo; benutze App \ Validation \ PostValidator;

Klasse PostController erweitert Controller private $ repo;

öffentliche Funktion __construct (repo $ repo) $ this-> repo = $ repo;  public function edit ($ id = NULL) return View ('admin.edit') -> mit (['data' => $ this-> repo-> postOfId ($ id)]);  public function editPost () $ all = Eingabe :: all (); $ validate = PostValidator :: validate ($ all); if (! $ validate-> passt ()) return redirect () -> back () -> withInput () -> withErrors ($ validate);  $ Id = $ this-> repo-> postOfId ($ all ['id']); if (! is_null ($ Id)) $ this-> repo-> update ($ Id, $ all); Session :: flash ('msg', 'Erfolg bearbeiten');  else $ this-> repo-> create ($ this-> repo-> perpare_data ($ all)); Session :: flash ('msg', 'add success');  return redirect () -> zurück ();  public function retrieve () return View ('admin.index') -> mit (['Data' => $ this-> repo-> retrieve ()));  public function delete () $ id = Eingabe :: get ('id'); $ data = $ this-> repo-> postOfId ($ id); if (! is_null ($ data)) $ this-> repo-> delete ($ data); Session :: flash ('msg', 'operation success'); return umleiten () -> zurück ();  else return redirect () -> back () -> withErrors ('operationFails');  "

Wie Sie sehen, habe ich den Flash-Helfer verwendet, um die Nachrichten zu verwalten (Sie können Laravel verwenden). In Bezug auf den Validator sollte ich hinzufügen, dass Sie (wie ich) eigene erstellen oder den Laravel-Standard verwenden können, je nach Ihren Vorlieben.

Ansichtsdateien sind wie gewohnt. In dieser Beispielansicht scheint die Datei zu sein resources / views / admin / edit.blade.php :

"php

@if (Session :: has ('flash_notification.message')) !! Session :: get ('flash_notification.message') !! @endif @if ($ errors-> has ()) @foreach ($ errors-> all () als $ error)
  • !! $ error !!
@endforeach @endif
 
"

Das Routing und andere Operationen würden wie üblich sein.

Fazit

Nun sehen Sie, wie Sie auf einfache Weise ein Repository auf der Basis von Doctrine in Laravel 5.0 erstellen können, was viele Vorteile mit sich bringt.

Für diejenigen unter Ihnen, die entweder gerade mit Laravel beginnen oder Ihr Wissen, Ihre Site oder Anwendung mit Erweiterungen erweitern möchten, haben wir eine Vielzahl von Möglichkeiten, die Sie in Envato Market lernen können.