Основы ORM в Magento 2 – Модели, Ресурсы модели и Коллекции
В 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()
вызван явно.
Задача Коллекции состоит в том, чтобы извлекать набор строк из базы данных, затем выполнять итерацию по ним, а для каждой строки создавать экземпляр соответствующего класса Модели.
Это решает следующие задачи:
- Предоставляет контейнер для хранения коллекций объектов.
- Предотвращает ненужную загрузку данных.
- Хранит все объекты во время сеанса.
- Предоставляет интерфейс для фильтрации и сортировки объектов определенного вида.
Сервисные контракты в Magento 2
Сервисные контракты (service contracts) – это набор интерфейсов, с помощью которых в модулях можно объявлять стандартные API. С их помощью можно делать настройку без необходимости углубляться в ядро, а также они улучшают функциональную совместимость модулей.
Сервисные контракты выполняют ряд важных функций, таких как:
- Улучшение процесса обновления
- Формализация процесса кастомизации
- Разделение функциональности модулей
В Magento 2 реализована концепция «разработка на основе интерфейса», в которой разработчик полагается только на публичные методы, объявленные в интерфейсе, а не на имплементацию:
- Модули общаются только через API.
- Один модуль не знает об устройстве другого, поэтому имплементация может изменяться.
- Модули могут быть отключены или развернуты на отдельных серверах.
Теперь в Magento 2 вы можете настроить модуль, используя интерфейс API, который взаимодействует с Моделью, без непосредственного взаимодействия с ядром, что намного безопаснее.
Фабрика объектов в Magento 2
В объектно-ориентированном программировании фабричный (factory) метод – это метод, который используется для создания экземпляра объекта. Фабричные методы дают разработчику возможность контролировать, какие объекты фактически возвращаются в данном контексте.
В Magento 2 каждая CRUD модель имеет соответствующий фабричный класс. Все имена классов фабрики – это название класса Модели, к которому добавлено слово «Factory».
Фабричные классы в Magento 2 – это еще один пример использования системы автоматической генерации кода. Всякий раз, когда Менеджер объектов в Magento 2 встречает имя класса, оканчивающееся на слово Factory, он автоматически генерирует данный класс в папке generated/code
, если такой класс еще не существует.
Краткий итог
В сегодняшней статье мы рассмотрели основы ORM и CRUD в Magento 2. Команда разработчиков Magento 2 делает основной упор на Репозиториях, сервисных контрактах и различных транспортных уровнях API, которые обеспечивают эти CRUD функции. Данных изменений мы коснулись вскользь, поскольку это является очень обширной темой. И она заслуживает большей детализации. Сегодня же мы уделили внимание основам ORM шаблона ActiveRecord, в котором используются классы Модели, Ресурсной модели и Коллекции модели. Ведь эти модели остаются жизненно важной частью любого инструментария разработчика на Magento 2.