Förvarets mönster introducerades för första gången av Eric Evans i sin Domain Driven Design-bok. Förvaret är faktiskt utgångspunkten för Ansökan för att komma åt domän lager.
För att uttrycka det enkelt tillåter förvaret hela din kod att använda objekt utan att behöva veta hur föremålen kvarstår. Förvaret innehåller all kunskap om uthållighet, inklusive kartläggning från tabeller till objekt. Detta ger en mer objektorienterad vy av persistensskiktet och gör kartläggningskoden mer inkapslad.
Det enda sättet att få dina arkiv att fungera i Laravel (som en reell repository-Eric Evans Domain-Driven Design-bok) är att ändra standard ORM från aktiv post till data mapper. Det bästa alternativet är Läran.
Läran är en ORM (objektrelationell kartläggning) som implementerar datormaprarmönstret och låter dig göra en ren separation av programmets affärsregler från databasens persistenslager. Läran använder DQL, snarare än SQL. DQL ger dig objekt förfrågningsspråket, vilket betyder att du i stället för en traditionell relationell sökterm skulle ha frågor i objektterminen.
Det låter dig skriva databasfrågor på ett objektorienterat sätt och hjälper till när du behöver fråga databasen på ett sätt som inte kan uppnås med standardförvarsmetoderna. Enligt min mening är DQL det mest kraftfulla sättet att hålla kontakten med din databas.
Lärningsenheter är bara en vanlig PHP-enkelklass och lägger inte till överbelastning till något ORM-arv. Läran hanterar dina flera förfrågningsförfrågningar med samma arv utan att slå i databasen, vilket innebär att objektobjektet finns för hela förfrågan.
Den andra fina egenskapen i Läran är att istället för att migrera filer för att skapa databasschemat, skapas databasen automatiskt för att återspegla metadata i företagsannonserna. Å andra sidan är Eloquent mindre komplicerat och mycket lätt att använda.
En fullständig jämförelse mellan dessa två skulle kräva en separat artikel. Som du kan se är ett lärdobjekt lättare och mer abstrakt. Läran passar emellertid bara specifika projekt, så det kan ta tid för dig. Jag tror att det beror på programmeraren att välja den bästa ORM för appen.
Nu är det dags att skapa en bloggapp med Laravel. Först måste vi ställa upp Läran. Det finns en bro för att möjliggöra matchning med Laravel 5s befintliga konfiguration. För att installera Läran 2 i vårt Laravel-projekt kör vi följande kommando:
bash-kompositören kräver laravel-doktrin / orm
Som vanligt ska paketet läggas till app / config.php
, som tjänsteleverantör:
php LaravelDoctrine \ ORM \ DoctrineServiceProvider :: klass,
Aliaset ska också konfigureras:
php 'EntityManager' => LaravelDoctrine \ ORM \ Fasader \ EntityManager :: klass
Slutligen publicerar vi paketkonfigurationen med:
bash php artisan leverantör: publicera - tag = "config"
Nu är vi färdiga här.
Entiteter är viktiga delar av appen App \ Enheter \ Post.php
:
"php
namnrymd App \ Entity;
använd Läran \ ORM \ Mapping som ORM;
/ ** * @ORM \ Entity * @ORM \ Tabell (namn = "inlägg") * @ORM \ HasLifecycleCallbacks () * / klass Post / ** * @var heltal $ id * @ORM \ Column (name = " id ", typ =" heltal ", unikt = true, nullable = false) * @ORM \ Id * @ORM \ GeneratedValue (strategy =" AUTO ") * * / privat $ id;
/ ** * @ORM \ Kolumn (typ = "sträng") * / privat $ title; / ** * @ORM \ Kolumn (typ = "text") * / privat $ kropp; offentlig funktion __construct ($ input) $ this-> setTitle ($ input ['title']); $ This-> setBody ($ input [ 'kropp']); allmän funktion setId ($ id) return $ this-> id = $ id; allmän funktion getId () return $ this-> id; offentlig funktion getTitle () returnera $ this-> title; allmän funktion setTitle ($ title) $ this-> title = $ title; offentlig funktion getBody () returnera $ this-> body; allmän funktion setBody ($ body) $ this-> body = $ body; "
Nu är det dags att skapa Repository, som beskrivits tidigare. App / Arkiv / PostRepo.php
:
"php namespace App \ Repository;
använd App \ Entity \ Post; använd läran \ ORM \ EntityManager; klass PostRepo
/ ** * @varsträng * / privat $ class = 'App \ Entity \ Post'; / ** * @var EntityManager * / privat $ em; offentlig funktion __construct (EntityManager $ em) $ this-> em = $ em; allmän funktion skapa (Post $ post) $ this-> em-> persist ($ post); $ This-> syssel-> flush (); public function update (post $ post, $ data) $ post-> setTitle ($ data ['title']); $ Post-> setBody (data $ [ 'kropp']); $ This-> syssel-> kvarstår ($ post); $ This-> syssel-> flush (); offentlig funktion PostOfId ($ id) return $ this-> em-> getRepository ($ this-> class) -> findOneBy (['id' => $ id]); public function delete (Post $ post) $ this-> em-> ta bort ($ post); $ This-> syssel-> flush (); / ** * skapa inlägg * @return Post * / privat funktion perpareData ($ data) returnera ny post ($ data);
"
Kontrollenheten: App / HTTP / Controllers / PostController.php
:
"php namespace App \ Http \ Controllers; använd App \ Repository \ PostRepo som repo; använd App \ Validation \ PostValidator;
klass PostController utökar Controller privat $ repo;
offentlig funktion __construct (repo $ repo) $ this-> repo = $ repo; public function edit ($ id = NULL) returnera Visa ('admin.edit') -> med (['data' => $ this-> repo-> postOfId ($ id)]); public function editPost () $ all = Input :: alla (); $ validate = PostValidator :: validera ($ alla); om (! $ validate-> passes ()) return redirect () -> tillbaka () -> withInput () -> withErrors ($ validate); $ Id = $ this-> repo-> postOfId ($ all ['id']); om (! is_null ($ Id)) $ this-> repo-> update ($ Id, $ all); Session :: flash ('msg', 'redigera framgång'); annars $ this-> repo-> skapa ($ this-> repo-> perpare_data ($ all)); Session :: flash ('msg', 'add success'); returnera omdirigering () -> tillbaka (); public function retrieve () return Visa ('admin.index') -> med (['Data' => $ this-> repo-> hämta ()]); public function delete () $ id = Input :: get ('id'); $ data = $ this-> repo-> postOfId ($ id); om (! is_null ($ data)) $ this-> repo-> radera ($ data); Session :: flash ('msg', 'operation Success'); returnera omdirigering () -> tillbaka (); else return redirect () -> tillbaka () -> withErrors ('operationFails'); "
Som du ser har jag använt Flash-hjälpen för att hantera meddelandena (du kan använda Laravel). När det gäller Validator, bör jag tillägga att du kan skapa din egen (som jag) eller använda Laravel-standard, beroende på din preferens.
Visa filer är desamma som vanliga. I den här urvalsbilden verkar filen som resurser / views / admin / edit.blade.php
:
"php
@if (Session :: har ('flash_notification.message')) !! Session :: get ('flash_notification.message') !! @endif @if ($ errors-> har ()) @foreach ($ errors-> all () som $ error)Routing och andra operationer skulle vara som vanligt.
Nu ser du hur du enkelt kan skapa ett förråd baserat på Läran i Laravel 5.0, vilket kommer att leda till många fördelar.
För er som antingen bara börjar med Laravel eller vill utvidga din kunskap, webbplats eller ansökan med tillägg, har vi en mängd olika saker du kan studera i Envato Market.