Modelul depozitului din Laravel 5

Modelul repozitorului a fost introdus pentru prima dată de Eric Evans în cartea sa de design bazată pe domenii. Depozit este, de fapt, punctul de intrare pentru cerere pentru a accesa domeniu strat.

Pentru a pur și simplu, depozitul permite întregului cod să utilizeze obiecte fără să știe cum sunt persistente obiectele. Depozitul conține toate cunoștințele de persistență, inclusiv cartografiere de la tabele la obiecte. Aceasta oferă o vedere mai orientată spre obiect a stratului de persistență și face ca codul de cartografiere să fie mai încapsulat.

Singura modalitate de a face ca depozitele dvs. să funcționeze în Laravel (ca carte reală - cartea cu design condusă de Eric Evans) este de a schimba ORM implicit din înregistrarea activă în Mapperul de date. Cel mai bun înlocuitor este doctrina.

Doctrina ORM

Doctrina este o mapare ORM (obiect-relațional) care implementează modelul de mapper de date și vă permite să faceți o separare clară a regulilor de afaceri ale aplicației de stratul de persistență al bazei de date. Doctrina utilizează DQL, mai degrabă decât SQL. DQL vă aduce o limbă de interogare obiect, ceea ce înseamnă că în loc de un termen de interogare relațional tradițional, ați avea interogări în termenul obiect.

Acesta vă permite să scrieți interogările bazei de date într-un mod orientat obiect și vă ajută când trebuie să interogați baza de date într-un mod care nu poate fi realizat utilizând metodele implicite de depozitare. În opinia mea, DQL este cel mai puternic mod de a păstra legătura cu baza de date.

Doctrină vs. elocvent

Entitățile doctrinare sunt doar o clasă simplă PHP simplu și nu adaugă aeriene oricărei moșteniri ORM. Doctrina gestionează multiplele cereri de interogare cu aceeași moștenire fără a atinge baza de date, ceea ce înseamnă că obiectul entității există pentru întreaga solicitare.

Cea mai bună caracteristică a Doctrinei este că, în loc de a migra fișierele pentru a crea schema bazei de date, baza de date este creată automat pentru a reflecta meta-datele din adnotările entității. Pe de altă parte, Eloquent este mai puțin complicat și foarte ușor de utilizat.

O comparație completă între aceste două ar necesita un articol separat. După cum puteți vedea, un obiect Doctrină este mai deschis și mai abstract. Cu toate acestea, doctrina se va potrivi doar unor proiecte specifice, astfel încât vă poate aduce uneori deasupra capului. Cred că depinde de programator să aleagă cel mai bun ORM pentru aplicație.

Aplicația Blog

Acum este momentul să creați o aplicație de blog cu Laravel. În primul rând, trebuie să instituim Doctrină. Există un pod care să permită potrivirea cu configurația existentă a lui Laravel 5. Pentru a instala Doctrina 2 în cadrul proiectului Laravel, executăm următoarea comandă:

bash compozitorul cere laravel-doctrină / orm

Ca de obicei, pachetul trebuie adăugat la app / config.php , ca furnizor de servicii:

php LaravelDoctrină \ ORM \ DoctrineServiceProvider :: clasă,

Aliasul ar trebui, de asemenea, să fie configurat:

php 'EntityManager' => LaravelDoctrină \ ORM \ Facade \ EntityManager :: clasa

În cele din urmă, publicăm configurația pachetului cu:

bash php artizan vânzător: publish --tag = "config"

Acum am terminat aici.

Entitățile sunt părți importante ale aplicației App \ Entități \ Post.php:

„php

spațiul de nume App \ Entity;

utilizați Doctrine \ ORM \ Mapping ca ORM;

/ ** * @ORM \ Entity * @ORM \ Table (name = "posts") * @ORM \ HasLifecycleCallbacks id ", type =" integer ", unic = true, nullable = false) * @ORM \ Id * @ORM \ GeneratedValue (strategie =" AUTO ") * * / privat $ id;

/ ** * @ORM \ Coloana (tip = "string") * / titlu privat $; / ** * @ORM \ Coloana (tip = "text") * / privat $ body; funcția publică __construct ($ input) $ this-> setTitle ($ input ['title']); $ This-> setBody ($ input [ 'body']);  funcția publică setId ($ id) return $ this-> id = $ id;  funcția publică getId () return $ this-> id;  funcția publică getTitle () return $ this-> title;  funcția publică setTitle ($ title) $ this-> title = $ title;  funcția publică getBody () return $ this-> body;  funcția publică setBody ($ corp) $ this-> body = $ body;  "

Acum este momentul să creați Repertoriu, care a fost descrisă mai devreme. App / inventare / PostRepo.php :

"spațiul de nume php App \ Repository;

utilizați App \ Entity \ Post; utilizați doctrină \ ORM \ EntityManager; class PostRepo

/ ** * @var șir * / privat $ class = 'App \ Entity \ Post'; / ** * @var EntityManager * / privat $ em; funcția publică __construct (EntityManager $ em) $ this-> em = $ em;  funcția publică creează (Post $ post) $ this-> em-> persist ($ post); $ This-> Molodva> flush ();  actualizarea funcției publice (Post $ post, $ date) $ post-> setTitle ($ data ['title']); $ Post-> setBody ($ date [ 'body']); $ This-> Molodva> persistă (post $); $ This-> Molodva> flush ();  funcția publică PostOfId ($ id) retur $ this-> em-> getRepository ($ this-> class) -> findOneBy (['id' => $ id]);  funcția publică șterge (Post $ post) $ this-> em-> remove ($ post); $ This-> Molodva> flush ();  / ** * a crea Mesaj * @ return Post * / funcția privată perpareData ($ data) returnează Mesaj nou ($ date);  

"

Controlorul: App / HTTP / Controllers / PostController.php :

"spațiu de nume php App \ Http \ Controllers; utilizați App \ Repository \ PostRepo ca repo; utilizați App \ Validation \ PostValidator;

clasa PostController extinde Controller private $ repo;

funcția publică __construct (repo $ repo) $ this-> repo = $ repo;  edita funcția publică ($ id = NULL) retur View ('admin.edit') -> cu (['data' => $ this-> repo-> postOfId ($ id)]);  funcția publică editPost () $ all = Input :: all (); $ validate = PostValidator :: validează ($ toate); dacă (! $ validate-> passes ()) returnează redirecționare () -> înapoi () -> cuInput () -> cuErrors ($ validate);  $ Id = $ acest-> repo-> postOfId ($ all ['id']); dacă (! is_null ($ Id)) $ this-> repo-> actualizare ($ Id, $ all); Session :: flash ('msg', 'edita succesul');  altceva $ this-> repo-> crea ($ this-> repo-> perpare_data ($ all)); Sesiune :: flash ('msg', 'adaugă succes');  return redirect () -> înapoi ();  funcția publică retrieve () retur View ('admin.index') -> cu (['Data' => $ this-> repo-> retrieve ()]);  funcția publică șterge () $ id = Input :: get ('id'); $ date = $ acest-> repo-> postOfId ($ id); dacă (! is_null ($ data)) $ this-> repo> șterge ($ date); Session :: flash ('msg', 'Succes de operare'); return redirect () -> înapoi ();  altceva return redirect () -> înapoi () -> cuErrors ('operationFails');  "

După cum vedeți, am folosit ajutorul Flash pentru a gestiona mesajele (puteți utiliza versiunea Laravel). În ceea ce privește Validatorul, trebuie să adaug că puteți crea propriul dvs. (așa cum fac eu) sau folosesc implicit Laravel, în funcție de preferința dvs..

Vizualizați fișierele sunt aceleași ca de obicei. În această mostră de probă, fișierul pare a fi Resurse / opinii / admin / edit.blade.php :

„php

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

Operațiile de rutare și alte operații ar fi ca de obicei.

Concluzie

Acum vedeți cum puteți crea cu ușurință un depozit bazat pe Doctrină în Laravel 5.0, care va avea ca rezultat multe beneficii.

Pentru cei care sunteți fie doar începători cu Laravel, fie căutați să vă extindeți cunoștințele, site-ul sau aplicația cu extensii, avem o varietate de lucruri pe care le puteți studia în piața Envato.

Cod