Я понимаю, что предпочтительным способом работы между модулями в Magento 2 является использование сервисных контрактов.
Поэтому, если я хочу загрузить продукт, я использую репозиторий продукта:
$product = $productRepository->getById($id);
который по контракту возвращает экземпляр Magento\Catalog\Api\Data\ProductInterface
.
Но я мог бы также использовать старый способ, вызывая слой домена напрямую:
$product = $productFactory->create()->load($id);
Есть ли случай, когда это было бы необходимо или полезно?
Девдоки говорят (выделение добавлено):
Модуль может напрямую вызывать в другой модуль. Это тесно связанное решение не рекомендуется для большинства ситуаций, но иногда его неизбежно .
[...]
Ваша стратегия вызова кода уровня домена другого модуля сильно зависит от уникальной конфигурации и потребностей вашей системы.
Источник: http://devdocs.magento.com/guides/v2.0/architecture/archi_perspectives/domain_layer.html
И комментарий по связанному вопросу заявил:
использование репозитория даст вам модель данных Product (
Api/Data/Product
), которая представляет собой модель Product, преобразованную в неработающий DTO. Что-то, чтобы рассмотреть, поскольку они довольно разные
Но, насколько я вижу, объекты одинаковы при нормальных условиях, отличаются только типы возвращаемых данных для phpDoc ( Magento\Catalog\Api\Data\ProductInterface
/ Magento\Catalog\Model\Product
)