Beholdermønsteret ble introdusert for første gang av Eric Evans i sin Domain-Driven Design-bok. Lageret er faktisk inngangspunktet for applikasjon for å få tilgang til domene lag.
For å si det enkelt, gjør depotet all koden din til å bruke objekter uten å måtte vite hvordan gjenstandene er vedvarende. Lageret inneholder all kunnskap om utholdenhet, inkludert kartlegging fra tabeller til objekter. Dette gir en mer objektorientert visning av persistenslaget og gjør kartleggingskoden mer innkapslet.
Den eneste måten å gjøre lagringsplassene dine i Laravel (som en reell repository-Eric Evans Domain-Driven Design-bok) er å endre standard ORM fra aktiv post til data mapper. Den beste erstatningen er Lære.
Læren er en ORM (objekt-relasjonell kartlegging) som implementerer data mapper mønsteret og lar deg gjøre en ren adskillelse av programmets forretningsregler fra persistenslaget av databasen. Lære bruker DQL, i stedet for SQL. DQL gir deg objekt for spørrespråk, noe som betyr at du i stedet for en tradisjonell relasjonsforespørselsperiode vil ha spørsmål i objektperioden.
Den lar deg skrive databasespørsmålene på en objektorientert måte, og hjelper når du trenger å spørre databasen på en måte som ikke kan oppnås ved hjelp av standard lagringsmetoder. Etter min mening er DQL den mest effektive måten å holde kontakten med databasen din.
Læreenheter er bare en enkel PHP enkel klasse og legger ikke overhead til noen ORM arv. Lære styrer dine flere forespørselsforespørsler med samme arv uten å trykke på databasen, noe som betyr at objektobjektet eksisterer for hele forespørselen.
Den andre fine funksjonen i doktrinen er at i stedet for å migrere filer for å lage databaseskjemaet, blir databasen automatisk opprettet for å reflektere metadataene i annonseannonsene. På den annen side er Eloquent mindre komplisert og veldig lett å bruke.
En komplett sammenligning mellom disse to ville nødvendiggjøre en egen artikkel. Som du kan se, er et læreobjekt lettere og mer abstrakt. Lære vil imidlertid bare passe bestemte prosjekter, slik at det kan føre til overhead til tider. Jeg tror det avhenger av programmøren å velge den beste ORM for appen.
Nå er det på tide å lage en bloggapp med Laravel. Først må vi sette opp læren. Det er en bro for å tillate samsvar med Laravel 5s eksisterende konfigurasjon. For å installere Lære 2 i Laravel-prosjektet, kjører vi følgende kommando:
bash komponist krever laravel-doktrin / orm
Som vanlig skal pakken legges til app / config.php
, som tjenesteleverandør:
php LaravelDoctrine \ ORM \ DoctrineServiceProvider :: klasse,
Aliaset skal også konfigureres:
php 'EntityManager' => LaravelDoctrine \ ORM \ Fasader \ EntityManager :: klassen
Endelig publiserer vi pakke konfigurasjonen med:
bash php artisan leverandør: publiser - tag = "config"
Nå er vi ferdige her.
Enheter er viktige deler av appen App \ Entities \ post.php
:
"php
navneområde App \ Entity;
bruk doktrin \ ORM \ Kartlegging som ORM;
/ ** * @ORM \ Entity * @ORM \ Tabell (navn = "innlegg") * @ORM \ HasLifecycleCallbacks () * / klasse Post / ** * @var heltall $ id * @ORM \ Column (name = " id ", type =" heltall ", unikt = true, nullable = false) * @ORM \ Id * @ORM \ GeneratedValue (strategi =" AUTO ") * * / privat $ id;
/ ** * @ORM \ Kolonne (type = "streng") * / privat $ title; / ** * @ORM \ Kolonne (type = "tekst") * / privat $ kropp; offentlig funksjon __construct ($ input) $ this-> setTitle ($ input ['title']); $ Dette-> setBody ($ inngang [ 'legemet']); offentlig funksjon setId ($ id) return $ this-> id = $ id; offentlig funksjon getId () return $ this-> id; offentlig funksjon getTitle () return $ this-> title; offentlig funksjon setTitle ($ title) $ this-> title = $ title; offentlig funksjon getBody () return $ this-> body; offentlig funksjon setBody ($ body) $ this-> body = $ body; "
Nå er det på tide å lage Oppbevaringssted, som ble beskrevet tidligere. App / Oppbevaringssteder / PostRepo.php
:
"php namespace App \ Repository;
bruk App \ Entity \ Post; bruk doktrin \ ORM \ EntityManager; klasse PostRepo
/ ** * @var string * / private $ class = 'App \ Entity \ Post'; / ** * @var EntityManager * / private $ em; offentlig funksjon __construct (EntityManager $ em) $ this-> em = $ em; offentlig funksjon opprette (Post $ post) $ this-> em-> vedvarer ($ post); $ Dette-> em> flush (); offentlig funksjon oppdatering (Post $ post, $ data) $ post-> setTitle ($ data ['title']); $ Post-> setBody ($ data [ 'legemet']); $ Dette-> em> vedvare ($ post); $ Dette-> em> flush (); offentlig funksjon PostOfId ($ id) return $ this-> em-> getRepository ($ this-> class) -> findOneBy (['id' => $ id]); Offentlig funksjon slette (Post $ post) $ this-> em-> remove ($ post); $ Dette-> em> flush (); / ** * opprett Post * @return Post * / privat funksjon perpareData ($ data) returner nytt innlegg ($ data);
"
Kontrolleren: App / Http / elektro / PostController.php
:
"php namespace App \ Http \ Controllers; bruk App \ Repository \ PostRepo som repo; bruk App \ Validation \ PostValidator;
klasse PostController utvider Controller private $ repo;
offentlig funksjon __construct (repo $ repo) $ this-> repo = $ repo; offentlig funksjon redigere ($ id = NULL) return View ('admin.edit') -> med (['data' => $ this-> repo-> postOfId ($ id)]); offentlig funksjon editPost () $ all = Input :: all (); $ validate = PostValidator :: validere ($ alle); hvis (! $ validere-> passerer ()) return omdirigering () -> tilbake () -> withInput () -> withErrors ($ validate); $ Id = $ this-> repo-> postOfId ($ all ['id']); hvis (! er_null ($ Id)) $ this-> repo-> update ($ Id, $ all); Session :: flash ('msg', 'edit suksess'); ellers $ this-> repo-> create ($ this-> repo-> perpare_data ($ all)); Session :: flash ('msg', 'add success'); returnere omdirigering () -> tilbake (); offentlig funksjon hente () return View ('admin.index') -> med (['Data' => $ this-> repo-> hente ()]); offentlig funksjon slette () $ id = Input :: get ('id'); $ data = $ this-> repo-> postOfId ($ id); hvis (! er_null ($ data)) $ this-> repo-> slette ($ data); Session :: flash ('msg', 'operation Suksess'); returnere omdirigering () -> tilbake (); else return redirect () -> tilbake () -> withErrors ('operationFails'); "
Som du ser, har jeg brukt Flash-hjelperen til å administrere meldingene (du kan bruke Laravel). Når det gjelder Validator, må jeg legge til at du kan lage din egen (som jeg gjør) eller bruke Laravel-standarden, avhengig av din preferanse.
Se filene er de samme som vanlig. I denne prøvevisningen ser filen ut som ressurser / synspunkter / admin / edit.blade.php
:
"php
@if (Session :: har ('flash_notification.message')) !! Session :: get ('flash_notification.message') !! @endif @if ($ errors-> har ()) @foreach ($ errors-> all () som $ feil)Rutingen og andre operasjoner vil være som vanlig.
Nå ser du hvordan du enkelt kan lage et lager basert på Doctrine in Laravel 5.0, som vil resultere i mange fordeler.
For de av dere som enten bare er i gang med Laravel eller ser ut til å utvide din kunnskap, nettsted eller søknad med utvidelser, har vi en rekke ting du kan studere i Envato Market.