Мне известно, что 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?
источник
\Magento\Customer\Api\Data\CustomerInterface
доступны для API REST / SOAP (если включено). Однако вам не нужна модель данных, чтобы выбрать, какие методы будут представлены, поскольку вместо этого вы можете просто подключить интерфейс к «реальной» модели. Вот как это делается с\Magento\Catalog\Model\Product
и\Magento\Catalog\Api\Data\ProductInterface
Добавляя к ответу @ Phoenix128_RiccardoT, стоит отметить, что хранилища (то есть
MagentoCms\Api\BlockRepository
илиMagento\Customer\Api\CustomerRepositoryInterface
) также ожидают, что вы предоставите модель данных, а не обычную. Модели данных - это уровень абстракции над стандартными моделями, который предоставляет только данные, предоставленные объектом. Все «действия» над этими данными перемещаются в другое место.Это немного похоже на идею сущностей в Symfony2 и Symfony3, где сущности содержат только данные, и любые манипуляции с данными происходят в диспетчере сущностей. Я полагаю, что в Magento2 эта роль была отдана хранилищам.
Старые модели все еще с нами, потому что они были разработаны magento2. Очевидно, что они не начинались с пустого index.php, но повторно использовали некоторый код из M1. Когда вы посмотрите на стандартных модельных методов (
load()
,save()
иdelete()
) все помечены какdeprecated
. Это связано с тем, что эта работа перемещается в репозитории (при условии, что в некоторых случаях все хранилище сейчас вызывает этотsave()
метод обычной модели, но путь мне кажется ясным).источник
Модели инкапсулируют независимую от хранилища бизнес-логику, они не знают о механизмах или экземплярах баз данных, в 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 состоит из моделей, моделей ресурсов и коллекций и зависит от базы данных, целью контракта на обслуживание является скрытие логики хранилища, чтобы клиент, подключенный к репозиторию (контракт на обслуживание), не заботился о целевом хранилище. двигатель.
источник