В Magento 2 также, как и в Magento 1, используется ORM (объектно-реляционное отображение). Здесь также участвует шаблон Active Record (AR), который использует классы Модели, Ресурсной модели и Коллекции модели. Это позволяет использовать CRUD-функции в ваших собственных модулях, т.е., управлять данными в базе данных: создавать (create), читать (read), обновлять (update) и удалять (delete) данные.
ORM в Magento 2 используется реализациями Репозитория, которые являются частью сервисных контрактов (service contracts). Это важное отличие от Magento 1, так как модуль больше не должен зависеть от других модулей (использующих, возможно, разный ORM), а вместо этого использовать только хранилища сущностей.
Элементы ORM в Magento 2 следующие:
Концепция ORM в Magento 2 требует, чтобы только модели могли содержать данные и манипулировать ими. При создании новой модели, которая взаимодействует с базой данных, модели необходимо знать, какую Ресурсную модель следует использовать. Вот почему имя класса Ресурсной модели задается с помощью метода _init() в защищенной функции _construct(). Это необходимо для поддержки унаследованных методов getResource() и getCollection() класса AbstractModel.
Чтобы создать CRUD Модель, вы просто создаете класс и расширяете его с \Magento\Framework\Model\AbstractModel. Обратите внимание, что вы вызываете _init из метода конструктора с одним подчеркиванием, а не реального PHP конструктора с двойным подчеркиванием. Этот метод _construct() вызывается реальным методом __construct(), который унаследован через класс AbstractModel.
Ресурсная модель расширяется классом \Magento\Framework\Model\ResourceModel\Db\AbstractDb.
Коллекция расширяется классом \Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection.
При создании Коллекции ресурсов необходимо указать, с какой моделью она соотносится, чтобы Коллекция могла создавать экземпляры соответствующих классов после загрузки списка записей. Также необходимо знать соответствующую Ресурсную модель, чтобы иметь возможность доступа к базе данных. Вот почему имена классов Модели и Ресурсной модели задаются с помощью метода _init() в защищенном методе _construct().
В Модели Magento2 используются CRUD методы load(), save() и delete(), которые соотносятся с Ресурсной моделью. Если вы хотите писать более безопасный код, не используйте CRUD методы в Модели, поскольку они могут быть удалены в будущем. Вместо этого Модель следует передавать непосредственно в CRUD методы в Ресурсной модели. Модель не имеет прямого доступа к базе данных, он есть только у Ресурсной модели.
Ресурсная модель обращается к базе данных через \Magento\Framework\Db\Adapter\Pdo и Zend\Db.
API, который используется для Коллекций, реализуется через \Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection.
Коллекция ресурсов необходима для создания набора экземпляров Модели и работы с ними. Коллекции ресурсов делают ленивую загрузку (lazy load) набора записей, который они представляют. При первом обращении к списку элементов Коллекция будет загружена автоматически. После этого Коллекция не будет загружаться снова, даже если метод load() вызван явно.
Задача Коллекции состоит в том, чтобы извлекать набор строк из базы данных, затем выполнять итерацию по ним, а для каждой строки создавать экземпляр соответствующего класса Модели.
Это решает следующие задачи:
Сервисные контракты (service contracts) – это набор интерфейсов, с помощью которых в модулях можно объявлять стандартные API. С их помощью можно делать настройку без необходимости углубляться в ядро, а также они улучшают функциональную совместимость модулей.
Сервисные контракты выполняют ряд важных функций, таких как:
В Magento 2 реализована концепция «разработка на основе интерфейса», в которой разработчик полагается только на публичные методы, объявленные в интерфейсе, а не на имплементацию:
Теперь в Magento 2 вы можете настроить модуль, используя интерфейс API, который взаимодействует с Моделью, без непосредственного взаимодействия с ядром, что намного безопаснее.
В объектно-ориентированном программировании фабричный (factory) метод – это метод, который используется для создания экземпляра объекта. Фабричные методы дают разработчику возможность контролировать, какие объекты фактически возвращаются в данном контексте.
В Magento 2 каждая CRUD модель имеет соответствующий фабричный класс. Все имена классов фабрики – это название класса Модели, к которому добавлено слово «Factory».
Фабричные классы в Magento 2 – это еще один пример использования системы автоматической генерации кода. Всякий раз, когда Менеджер объектов в Magento 2 встречает имя класса, оканчивающееся на слово Factory, он автоматически генерирует данный класс в папке generated/code, если такой класс еще не существует.
В сегодняшней статье мы рассмотрели основы ORM и CRUD в Magento 2. Команда разработчиков Magento 2 делает основной упор на Репозиториях, сервисных контрактах и различных транспортных уровнях API, которые обеспечивают эти CRUD функции. Данных изменений мы коснулись вскользь, поскольку это является очень обширной темой. И она заслуживает большей детализации. Сегодня же мы уделили внимание основам ORM шаблона ActiveRecord, в котором используются классы Модели, Ресурсной модели и Коллекции модели. Ведь эти модели остаются жизненно важной частью любого инструментария разработчика на Magento 2.
WordPress годами был непревзойденным "монолитом": он отвечал и за удобную админ-панель, и за хранение данных,…
В мире веб-серверов часто говорят о противостоянии Nginx vs Apache. Но что, если бы я…
Когда я начинал свой путь в веб-разработке, вопрос "какой веб-сервер использовать?" практически не стоял. Ответ…
Когда речь заходит о веб-серверах, два имени всегда на слуху: Apache и Nginx. Apache —…
В мире веб-разработки мы постоянно сталкиваемся с проблемой: "А у меня на компьютере все работает!".…
На заре моей карьеры веб-разработчика все было относительно просто: установил локальный сервер (помните Denwer?), положил…