Ca dezvoltator PHP, s-ar putea să fi întâlnit termenul ORM. ORM este o modalitate de a lucra cu bazele de date în același mod în care lucrați cu clase și obiecte. Dacă v-ați afla mai adânc în modul în care sunt proiectate și construite aplicațiile web, după ce ați explorat în ORM-ul dvs. veți găsi două modele bine cunoscute: Înregistrare activă și Mapper de date.
Înregistrare activă se referă la maparea unui obiect la un rând de baze de date. Într-adevăr, fiecare rând din baza de date este legat de un obiect. Când preluați un rând din baza de date, puteți actualiza, șterge sau salva utilizând obiectul în sine. Așa lucrează Elloquent și Paris și cum se face în Ruby on Rails.
Pe de altă parte, Mapper de date
este un strat de software care separă obiectele din memorie din baza de date. Cu Mapperul de date obiectele din memorie nu trebuie să știe că există chiar și o bază de date prezentă. Nu au nevoie de cod de interfață SQL sau de cunoștințe despre schema bazei de date. O astfel de soluție este doctrina.
Doctrina este un ORM care implementează modelul de mapper de date și vă permite să faceți o separare clară a regulilor de afaceri ale aplicației de la stratul de persistență al bazei de date.
Unele dintre avantajele pe care le-am descoperit în timp ce folosesc Doctrina cu Laravel sunt:
Afișarea tranzacțiilor în spatele tranzacției
metodologia permite doctrinei să aibă o mai mică interacțiune cu baza de date până la culoare()
se numește metoda.Desigur, doctrina are și dezavantaje, dar este de datoria programatorului să aleagă ORM-ul potrivit.
DQL reprezintă Doctrine Query Language. DQL vă aduce o limbă de interogare obiect, ceea ce înseamnă că, în loc de o interogare relațională tradițională, aveți interogări în forma obiectului.
DQL vă permite să scrieți interogări baze de date într-un mod orientat pe obiect, ceea ce este util atunci când trebuie să interogați baza de date într-un mod care nu poate fi realizat (sau este foarte dificil) utilizând metode de stocare implicite.
Exemplu de interogare DQL:
sql SELECT b.id ca ItemId, b.title ca ItemTitle, b.url ca ItemUrl din Alireza \ Domain \ Identity \ Entities \ Meniu u WHERE u.id =: id
Doctrina vă permite să limitați rezultatele interogării cu Filtre. De exemplu, este posibil să doriți să editați numai informațiile despre utilizatorul conectat sau să vă asigurați că datele clientului curent au fost returnate din baza de date. Un filtru este o soluție automată pentru a vă reaminti condițiile specifice pentru toate interogările dvs..
Doctrina oferă limitări la nivelul SQL, astfel încât nu este nevoie să mențineți clauza în mai multe depozite ale proiectului dvs. Acest lucru îmbunătățește securitatea și face codul dvs. mai ușor de citit.
Să examinăm un exemplu:
php / ** * @ManyToOne (targetEntity = "Utilizator") * @JoinColumn (nume = "user_id", referencedColumnName = "id") ** / user privat $;
După cum puteți vedea în entitatea utilizatorului, rezultatul JoinColumn
se limitează la numai articolele cu condiția WHERE user_id =: user_id
.
Pentru a configura doctrina, există o punte 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"
Doctrina nu are nevoie de configurare a bazei de date și utilizează configurația curentă Laravel, dar dacă doriți să o înlocuiți ar trebui să schimbați fișierul Configurare doctrină în Config / doctrine.php
:
"metadata" => env ('DOCTRINE_METADATA', 'adnotări'), 'connection' => env (' DB_CONNECTION ',' mysql '),' namespaces '=> [' App '],
"Cam despre asta e.
"Entitatea" se referă la un obiect care are o identitate distinctă. O entitate trebuie să aibă un identificator specific care este unic în întregul sistem, cum ar fi un client sau un student. Ar exista și alte obiecte, cum ar fi adresele de e-mail, care nu sunt entități, ci obiecte de valoare.
Să creați o entitate postare App / Entitate / Post.php
:
"spațiu de nume php 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ă 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; "
Proprietățile clasei ar trebui să fie aceleași cu câmpurile din tabela de baze de date sau să le puteți defini cu @Colum ( "name" = "myfield")
adnotare.
Depozitul permite întregului cod să utilizeze obiecte fără a fi nevoie 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.
Acum este momentul să creați Repertoriu în App / depozitari / PostRepo.php
:
"spațiu de nume php App \ Repository; utilizați App \ Entity \ Post; utilizați Doctrine \ 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ă prepareData ($ data) returnează Mesaj nou ($ date);
"
Doctrina EntityManager
funcționează ca punct de acces pentru gestionarea completă a entităților dvs. Apoi, creați controlerul 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.index') -> 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'); "Vizualizarea și rutarea sunt aceleași ca de obicei.
Prefer să-mi creez propriul Validator bazat pe clasa Valavator a lui Laravel. Iată Validatorul App \ de validare \ PostValidator.php
:
"spațiu de nume php App \ Validation; utilizați Validator;
clasa PostValidator valida funcția statică publică ($ input) $ rules = ['title' => 'Necesar | Min: 4 | Max: 80 | alpha_spaces', 'body' => 'Required'; return Validator :: face ($ input, $ rules); "
Dacă nu ați lucrat anterior cu Doctrina 2, sper că acest articol a fost interesant și informativ. Laravel 5 nu folosește Doctrina, dar după cum puteți vedea, există câteva pachete care ne permit să o folosim cu ușurință cu Laravel. Am creat o aplicație blog simplu cu Laravel 5 și Doctrine ORM și sper că acest lucru vă poate ajuta să creați aplicația dorită. Salut comentariile dvs..