Magento 2: Різниця між моделями та моделями даних


13

Мені відомо, що Magento 2 представив моделі даних як частину архітектури контрактів на послуги. Моделі даних зазвичай реалізують інтерфейси, визначені в Api / Data / модуля.

Але, Magento, схоже, зберегли і старі моделі.

Візьмемо приклад для модуля-замовника.

  • Інтерфейс моделі даних визначений в Api / Data / CustomerInterface.php
  • Вищевказаний інтерфейс реалізований у Model / Data / Customer.php
  • Модель даних має всі функції отримання та встановлення для змінних клієнтів, як можна було б очікувати
  • На додаток до вищезазначеного також є Model / Customer.php. У цьому теж є функція геттера та сетера. Це більше схоже на модель Magento 1, яка підключається до ResourceModel (Model / ResourceModel / Customer.php)
  • У Model / ResourceModel / CustomerRepository.php різні функції збирають дані з моделі Magnento 1, передають їх у модель даних, а потім повертають модель даних.

Для чого потрібна стара модель? Чому модель даних не може безпосередньо з'єднуватися з ResourceModel?

Відповіді:


7

Моє пояснення:

Дуже важко зрозуміти різницю між моделлю та моделлю даних. Якщо мені доведеться сказати кількома словами, я можу сказати, що модель представляє двигун, а модель даних представляє його інформацію .

У вашому прикладі, з організацією-замовником, ви можете побачити, наприклад, як метод authenticateабо validatePasswordзберігаються в моделі клієнта, оскільки вони є частиною двигуна, і вони не збираються безпосередньо обробляти інформацію. З іншого боку, такі способи getExtensionAttributes, як обробка інформації, зберігаються в моделі даних.

Я думаю, що це просто краща робота з проектами, як і поділ між моделями та моделями ресурсів, ви можете запитати, навіщо вони вам також потрібні.

Для чого вони потрібні:

Якщо ви хочете розкрити інформацію про клієнтів (наприклад) за допомогою API, вам знадобиться інтерфейс ( \Magento\Customer\Api\Data\CustomerInterface) з геттерами, що визначають усі атрибути вашої організації, і якщо у вас є інший метод отримання, який не представляє інформацію, яку ви хочете викрити (наприклад: getRandomConfirmationKey), у вас проблема!

Тому, на моєму прикладі, getRandomConfirmationKeyє частиною моделі ( \Magento\Customer\Model\Customer), тоді як getFirstnameє частиною моделі даних.

Швидке правило може бути:

  • Якщо ваш метод представляє стовпчик таблиці, атрибут або інформацію про сутність будь-якого типу, тоді слід перейти до моделі даних .
  • Якщо ваш метод є "дією" на інформацію, він обробляє інформацію або ви заявляєте її в webapi.xml , тоді це повинен бути модельний метод.

POST:

Кілька слів: розгляньте модель даних майже як DTO.


Всі методи в \Magento\Customer\Api\Data\CustomerInterfaceпіддаються дії API REST / SOAP (якщо він включений). Однак для вибору методів даних вам не потрібна модель даних, оскільки ви можете просто підключити інтерфейс до 'реальної' моделі. Ось так це робиться \Magento\Catalog\Model\Productі з\Magento\Catalog\Api\Data\ProductInterface
Мілан Симек

2

Додавши до @ Phoenix128_RiccardoT відповідь, варто зазначити, що сховища (тобто MagentoCms\Api\BlockRepositoryабо Magento\Customer\Api\CustomerRepositoryInterface) також очікують, що ви надасте модель даних, а не звичайну. Моделі даних - це рівень абстрагування над стандартними моделями, який відкриває лише дані, що надаються сутністю. Усі "дії" над цими даними переміщуються в інше місце.

Це трохи схоже на ідею сутності в Symfony2 та Symfony3, де об'єкти містять лише дані, а будь-яка маніпуляція даними відбувається в менеджері сутностей. В Magento2 цю роль, я вважаю, відводили сховищам.

Старі моделі все ще з нами, тому що вони були розроблені magento2. Вони, очевидно, не починалися з пустого index.php, але повторно використовували деякий код з M1. Коли ви подивіться на стандартних модельних методів ( load(), save()і delete()) все позначені як deprecated. Це тому, що ця робота переміщується в сховища (за умови, що в деяких випадках зараз все сховище викликає цей звичайний save()метод моделі, але дорога мені здається зрозумілою).


1
Як щодо моделі даних про продукт. Немає моделі даних про продукт
sivakumar

2

Моделі інкапсулюють незалежну бізнес-логіку зберігання, вони не знають про двигуни бази даних або екземпляри, в Magento 2 Моделі даних - це об'єкти передачі даних (DTO), реалізація специфічних інтерфейсів DTO (модель даних) для моделей Magento CRUD (модель ) визначає, які методи класів доступні через Magento WebAPI.

Model/Data/Customer.phpвизначає, які способи доступні для API, тоді як Model/Customer.phpмає застарілу реалізацію типу Magento 1 користувацьких геттерів та сетерів, доступних для операцій, які не належать API.

Model/ResourceModel/CustomerRepository.php є частиною нової функції, представленої в Magento 2 - Контракти на обслуговування, вона працює з комбінацією DTO (Data Models).

Оскільки ми знаємо, що Magento ORM складається з моделей, моделей ресурсів та колекцій і залежить від бази даних, метою сервісного контракту є приховування логіки зберігання, щоб клієнт, підключений до сховища (контракт на обслуговування), не піклувався про цільове сховище двигун.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.