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?

om_deshpande
источник

Ответы:

7

Мое объяснение:

Очень трудно понять разницу между моделью и моделью данных. Если я должен сказать в нескольких словах, я мог бы сказать, что модель представляет двигатель, а модель данных представляет его информацию .

В вашем примере, с сущностью customer, вы можете увидеть, например, как метод authenticateили validatePasswordхранится в модели customer, поскольку они являются частью механизма и не собираются напрямую обрабатывать информацию. С другой стороны, методы похожи getExtensionAttributes, так как обработка частей информации хранится в модели данных.

Я думаю, что это просто лучшая обработка проекта, так же как и разделение между моделями и моделями ресурсов, вы можете спросить, зачем они вам нужны.

Почему они вам нужны:

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

Вот почему, в моем примере, getRandomConfirmationKeyявляется частью модели ( \Magento\Customer\Model\Customer), а getFirstnameявляется частью модели данных.

Быстрое правило может быть:

  • Если ваш метод представляет собой столбец таблицы, атрибут или информацию об объекте любого вида, то следует перейти к модели данных .
  • Если ваш метод является «действием» над информацией, он обрабатывает информацию или вы объявляете ее в webapi.xml , то это должен быть метод модели .

ПОЧТА:

В двух словах: рассмотрите модель данных почти как DTO.

Phoenix128_RiccardoT
источник
Все методы \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()метод обычной модели, но путь мне кажется ясным).

Zefiryn
источник
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 состоит из моделей, моделей ресурсов и коллекций и зависит от базы данных, целью контракта на обслуживание является скрытие логики хранилища, чтобы клиент, подключенный к репозиторию (контракт на обслуживание), не заботился о целевом хранилище. двигатель.

Аднан
источник