Основи ORM в Magento 2 – Моделі, Ресурси моделі та Колекції

Основи 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.

 



Напишіть тут свою думку/питання

Ваша пошта не публікуватиметься. Обов’язкові поля позначені *