Шаблон репозитория был впервые представлен Эриком Эвансом в его книге «Проектирование на основе доменов» . Репозиторий фактически является точкой входа для доступа приложения к уровню домена .
Проще говоря, хранилище позволяет всему вашему коду использовать объекты без необходимости знать, как эти объекты сохраняются. Хранилище содержит все знания о постоянстве, включая отображение из таблиц в объекты. Это обеспечивает более объектно-ориентированное представление персистентного уровня и делает код отображения более инкапсулированным.
Единственный способ заставить ваши репозитории работать в Laravel (как настоящий репозиторий — книга Эрика Эванса по управлению доменами) — это изменить ORM по умолчанию с активной записи на преобразователь данных. Лучшая замена — Доктрина .
Учение ОРМ
Doctrine — это ORM (объектно-реляционное отображение), которое реализует шаблон отображения данных и позволяет четко отделить бизнес-правила приложения от уровня персистентности базы данных. Доктрина использует DQL, а не SQL. DQL предоставляет вам язык объектных запросов, что означает, что вместо традиционного термина реляционных запросов у вас будут запросы в терминах объекта.
Он позволяет вам писать запросы к базе данных объектно-ориентированным способом и помогает, когда вам нужно выполнить запрос к базе данных способом, который не может быть достигнут с использованием методов репозитория по умолчанию. На мой взгляд, DQL — самый мощный способ поддерживать связь с вашей базой данных.
Учение против Красноречия
Объекты Doctrine — это простой простой PHP-класс, который не добавляет накладных расходов на любое наследование ORM. Doctrine управляет несколькими запросами с одним и тем же наследованием, не затрагивая базу данных, то есть объект сущности существует для всего запроса.
Другой приятной особенностью Doctrine является то, что вместо переноса файлов для создания схемы базы данных автоматически создается база данных, отражающая метаданные в аннотациях сущностей. С другой стороны, Eloquent менее сложен и очень прост в использовании.
Полное сравнение между этими двумя потребует отдельной статьи. Как вы можете видеть, объект Doctrine легче и более абстрактен. Тем не менее, Doctrine подойдет только для конкретных проектов, поэтому иногда может оказаться слишком трудоемким. Я считаю, что программист должен выбрать лучший ORM для приложения.
Блог приложение
Теперь пришло время создать приложение для блога с Laravel. Во-первых, нам нужно создать Доктрину. Существует мост для соответствия существующей конфигурации Laravel 5. Чтобы установить Doctrine 2 в нашем проекте Laravel, мы запускаем следующую команду:
bash composer require laravel-doctrine/orm
Как обычно, пакет должен быть добавлен в app/config.php
в качестве поставщика услуг:
php LaravelDoctrine\ORM\DoctrineServiceProvider::class,
Псевдоним также должен быть настроен:
php 'EntityManager' => LaravelDoctrine\ORM\Facades\EntityManager::class
Наконец, мы публикуем конфигурацию пакета с:
bash php artisan vendor:publish --tag="config"
Теперь мы закончили.
Объекты являются важными частями приложения App\Entities\Post.php
:
« `PHP
Пространство имен App \ Entity;
используйте Doctrine \ ORM \ Mapping в качестве 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 (стратегии =” AUTO ”) * * / private $ id;
/ ** * @ORM \ Column (type = "string") * / личное $ title; / ** * @ORM \ Column (type = "text") * / личное $ тело; публичная функция __construct ($ input) { $ Этом-> SetTitle ($ вход [ 'название']); $ Этом-> setBody ($ вход [ 'тело']); } публичная функция setId ($ id) { return $ this-> id = $ id; } публичная функция getId () { вернуть $ this-> id; } публичная функция getTitle () { вернуть $ this-> title; } публичная функция setTitle ($ title) { $ this-> title = $ title; } публичная функция getBody () { вернуть $ this-> body; } публичная функция setBody ($ body) { $ this-> body = $ body; }} `` `
Теперь пришло время создать репозиторий , который был описан ранее. App/Repositories/PostRepo.php
:
« `php namespace App \ Repository;
используйте App \ Entity \ Post; использовать Doctrine \ ORM \ EntityManager; класс PostRepo {
/ ** * строка @var * / private $ class = 'App \ Entity \ Post'; / ** * @var EntityManager * / личное $ em; публичная функция __construct (EntityManager $ em) { $ this-> em = $ em; } публичная функция create (Post $ post) { $ This-> em-> сохраняются ($ пост); $ This-> Ет> флеша (); } обновление публичной функции (Post $ post, $ data) { $ Пост-> SetTitle ($ данные [ 'название']); $ Post-> setBody ($ данных [ 'тело']); $ This-> em-> сохраняются ($ пост); $ This-> Ет> флеша (); } публичная функция PostOfId ($ id) { вернуть $ this-> em-> getRepository ($ this-> class) -> findOneBy ([ 'id' => $ id ]); } публичная функция удаления (Post $ post) { $ This-> em-> удалить ($ пост); $ This-> Ет> флеша (); } / ** * создать сообщение * @return Post * / приватная функция perpareData ($ data) { вернуть новое сообщение ($ data); }}
« `
Контроллер: App/Http/Controllers/PostController.php
:
« `php namespace App \ Http \ Controllers; используйте App \ Repository \ PostRepo в качестве репозитория; используйте App \ Validation \ PostValidator;
класс PostController extends Controller {private $ repo;
публичная функция __construct (repo $ repo) { $ this-> repo = $ repo; } редактирование публичной функции ($ id = NULL) { return View ('admin.edit') -> with (['data' => $ this-> repo-> postOfId ($ id)]); } публичная функция editPost () { $ all = Input :: all (); $ validate = PostValidator :: validate ($ all); if (! $ validate-> pass ()) { return redirect () -> back () -> withInput () -> withErrors ($ validate); } $ Id = $ this-> repo-> postOfId ($ all ['id']); if (! is_null ($ Id)) { $ this-> repo-> update ($ Id, $ all); Session :: flash ('msg', 'edit success'); } еще { $ This-> repo-> создать ($ this-> repo-> perpare_data ($ все)); Session :: flash («msg», «добавить успех»); } return redirect () -> back (); } публичная функция retrieve () { return View ('admin.index') -> with (['Data' => $ this-> repo-> retrieve ()]); } публичная функция delete () { $ id = Input :: get ('id'); $ data = $ this-> repo-> postOfId ($ id); if (! is_null ($ data)) { $ This-> repo-> удалить ($ данных); Session :: flash («msg», «операция успешно»); return redirect () -> back (); } еще { return redirect () -> back () -> withErrors ('operationFails'); } }} `` `
Как вы видите, я использовал Flash Helper для управления сообщениями (вы можете использовать Laravel). Что касается Validator, я должен добавить, что вы можете создать свой собственный (как я) или использовать Laravel по умолчанию, в зависимости от ваших предпочтений.
Просмотр файлов такой же, как обычно. В этом примере представления файл выглядит как resources/views/admin/edit.blade.php
:
« `PHP
@endif
@if ($ errors-> имеет ())
- {!! $ error !!}
@endforeach
@endif
</ DIV> </ div> `` `
Маршрутизация и другие операции будут как обычно.
Вывод
Теперь вы видите, как вы можете легко создать хранилище на основе Doctrine в Laravel 5.0, что даст множество преимуществ.
Для тех из вас, кто только начинает работать с Laravel или хочет расширить свои знания, сайт или приложение с помощью расширений, у нас есть множество вещей, которые вы можете изучить на Envato Market .