Я понимаю, что предпочтительным способом работы между модулями в 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
)
источник
But I could also use the old way instead, calling the domain layer directly: (use factory). Is there any case where this would be necessary or useful?
, Да: когда вам нужно вызвать метод модели , а не методApi/Data/Product
. Это лучше? :)Для меня нет причин использовать
load
метод надgetById
/get
методом.Я не говорю, что я прав, но вот как я вижу вещи.
Итак, вот
getById
метод (get
метод похож, но использует идентификатор вместо идентификатора):Как вы можете заметить код, который вы вставили:
Является частью этой функции.
Однако дополнительное условие использует кэшированные экземпляры, чтобы избежать дополнительной перезагрузки в случае, если вы ранее использовали метод
getById
илиget
для того же идентификатора (или sku в случаеget
метода) .Вы можете подумать, что хорошей причиной для использования
load
может быть отказ от использования этих кэшированных экземпляров (в таком случае это может быть веской причиной? Я не знаю), ноgetById
уget
методов и есть$forceReload
параметр, для которого можно установить значение true, равное true. Избегайте использования этих экземпляров кэша.Вот почему для меня нет веской причины использовать
load
методgetById
илиget
методы.источник
Пожалуйста, поймите разницу между хранилищами и коллекциями.
В вашем примере, если вы используете репозитории, вы получите массив,
Magento\Catalog\Api\Data\ProductInterface
который отличается от получения коллекцииMagento\Catalog\Model\Product
.Репозитории и интерфейс данных обеспечивают высокий уровень интерфейса, который должен быть гарантированно совместим в будущих версиях . Вот почему это предложенный подход.
Надеюсь, это поможет.
источник