Het repository patroon in Laravel 5

Het repository-patroon werd voor de eerste keer geïntroduceerd door Eric Evans in zijn Domain-Driven Design-boek. De repository is in feite het toegangspunt voor de toepassing om toegang te krijgen tot de domein laag.

Om het simpel te zeggen, de repository staat al uw code toe om objecten te gebruiken zonder te weten hoe de objecten blijven bestaan. De repository bevat alle kennis van persistentie, inclusief het toewijzen van tabellen aan objecten. Dit biedt een meer objectgeoriënteerde weergave van de persistentielaag en maakt de toewijzingscode meer ingekapseld.

De enige manier om uw repository's in Laravel te laten werken (als een echt repository-Eric Evans Domain-Driven Design-boek) is om de standaard-ORM van actieve record naar gegevens-mapper te wijzigen. Het beste alternatief is Doctrine.

De doctrine ORM

Doctrine is een ORM (object-relationele toewijzing) die het patroon van de gegevensmap implementeert en waarmee u een schone scheiding kunt aanbrengen tussen de bedrijfsregels van de toepassing en de persistentielaag van de database. Doctrine gebruikt DQL in plaats van SQL. DQL levert object-querytaal op, wat betekent dat u in plaats van een traditionele relationele zoekterm query's in object-term zou hebben.

Hiermee kunt u de databasequery's op een objectgeoriënteerde manier schrijven en helpt u wanneer u de database moet bevragen op een manier die niet kan worden bereikt met behulp van de standaard repositorymethoden. Naar mijn mening is DQL de krachtigste manier om contact te houden met uw database.

Doctrine vs. Eloquent

Doctrine-entiteiten zijn gewoon een simpele PHP-eenvoudige klasse en voegen geen overhead toe aan enige ORM-overerving. Doctrine beheert uw meerdere queryverzoeken met dezelfde overerving zonder de database te raken, wat betekent dat het entiteitobject bestaat voor het gehele verzoek.

Het andere leuke kenmerk van Doctrine is dat in plaats van bestanden te migreren om het databaseschema te maken, de database automatisch wordt gemaakt om de metadata in de entiteitannotaties weer te geven. Aan de andere kant is Eloquent minder gecompliceerd en heel gemakkelijk te gebruiken.

Een volledige vergelijking tussen deze twee zou een afzonderlijk artikel vereisen. Zoals u kunt zien, is een doctrine-object lichter en abstracter. Doctrine past echter alleen in specifieke projecten, dus het kan u soms overbelasten. Ik geloof dat het afhankelijk is van de programmeur om de beste ORM voor de app te kiezen.

De blog-app

Nu is het tijd om een ​​blog-app te maken met Laravel. Ten eerste moeten we Doctrine opzetten. Er is een brug om toe te voegen aan de bestaande configuratie van Laravel 5. Om Doctrine 2 in ons Laravel-project te installeren, voeren we het volgende commando uit:

bash-componist heeft laravel-doctrine / orm nodig

Zoals gebruikelijk, moet het pakket worden toegevoegd aan de app / config.php , als de dienstverlener:

php LaravelDoctrine \ ORM \ DoctrineServiceProvider :: class,

De alias moet ook worden geconfigureerd:

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

Ten slotte publiceren we de pakketconfiguratie met:

bash php artisan verkoper: publiceer --tag = "config"

Nu zijn we hier klaar.

Entiteiten zijn belangrijke onderdelen van de app App \ Entiteiten \ post.php:

"php

naamruimte App \ Entity;

gebruik Doctrine \ ORM \ Mapping als ORM;

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

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

Nu is het tijd om het te maken bewaarplaats, die eerder werd beschreven. App / Repositories / PostRepo.php :

"php namespace App \ Repository;

gebruik App \ Entity \ Post; gebruik Doctrine \ ORM \ EntityManager; class PostRepo

/ ** * @var string * / private $ class = 'App \ Entity \ Post'; / ** * @var EntityManager * / private $ em; openbare functie __construct (EntityManager $ em) $ this-> em = $ em;  public function create (Post $ post) $ this-> em-> persist ($ post); $ This-> EM> flush ();  update openbare functie (Post $ post, $ gegevens) $ post-> setTitle ($ data ['title']); $ Post-> setBody ($ data [ 'body']); $ This-> EM> aanhouden ($ post); $ This-> EM> flush ();  openbare functie PostOfId ($ id) retourneer $ this-> em-> getRepository ($ this-> class) -> findOneBy (['id' => $ id]);  public function delete (Post $ post) $ this-> em-> remove ($ post); $ This-> EM> flush ();  / ** * create Post * @return Post * / private function perpareData ($ data) return new Post ($ data);  

"

De controller: App / Http / Controllers / PostController.php :

"php namespace App \ Http \ Controllers; gebruik App \ Repository \ PostRepo als repo; gebruik App \ Validation \ PostValidator;

class PostController verlengt Controller private $ repo;

openbare functie __construct (repo $ repo) $ this-> repo = $ repo;  public function edit ($ id = NULL) return View ('admin.edit') -> with (['data' => $ this-> repo-> postOfId ($ id)]);  public function editPost () $ all = Input :: all (); $ validate = PostValidator :: validate ($ all); if (! $ validate-> passes ()) return redirect () -> back () -> withInput () -> withErrors ($ validate);  $ Id = $ this-> repo-> postOfId ($ all ['id']); if (! is_null ($ Id)) $ this-> repo-> update ($ Id, $ all); Sessie :: flash ('msg', 'edit success');  else $ this-> repo-> create ($ this-> repo-> perpare_data ($ all)); Sessie :: flash ('msg', 'succes toevoegen');  return redirect () -> back ();  public function retrieve () return View ('admin.index') -> with (['Data' => $ this-> repo-> retrieve ()]);  public function delete () $ id = Input :: get ('id'); $ data = $ this-> repo-> postOfId ($ id); if (! is_null ($ data)) $ this-> repo-> delete ($ data); Sessie :: flash ('msg', 'operation Success'); return redirect () -> back ();  else return redirect () -> back () -> withErrors ('operationFails');  "

Zoals je ziet, heb ik de Flash-helper gebruikt om de berichten te beheren (je kunt Laravel's gebruiken). Wat de Validator betreft, zou ik moeten toevoegen dat u uw eigen (zoals ik) kunt maken of de Laravel-standaard kunt gebruiken, afhankelijk van uw voorkeur.

Bekijk bestanden zijn hetzelfde als gebruikelijk. In deze voorbeeldweergave lijkt het bestand resources / views / admin / edit.blade.php :

"php

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

De routing en andere bewerkingen zijn zoals gebruikelijk.

Conclusie

Nu zie je hoe je gemakkelijk een repository kunt maken op basis van Doctrine in Laravel 5.0, wat veel voordelen zal opleveren.

Voor degenen onder u die net zijn begonnen met Laravel of die op zoek zijn om uw kennis, site of applicatie uit te breiden met uitbreidingen, hebben we een aantal dingen die u kunt bestuderen in Envato Market.