Entiendo que la forma preferida de trabajar entre módulos en Magento 2 es usar los contratos de servicio.
Entonces, si quiero cargar un producto, uso el repositorio del producto:
$product = $productRepository->getById($id);
que es por contrato devolviendo una instancia de Magento\Catalog\Api\Data\ProductInterface.
Pero también podría usar el método antiguo, llamando directamente a la capa de dominio:
$product = $productFactory->create()->load($id);
¿Hay algún caso en el que esto sea necesario o útil?
Los devdocs dicen (resaltado agregado):
Un módulo puede llamar directamente a otro módulo. Esta solución estrechamente acoplada no se recomienda para la mayoría de las situaciones, pero a veces es inevitable .
[...]
Su estrategia para llamar al código de capa de dominio de otro módulo depende en gran medida de la configuración y las necesidades únicas de su sistema.
Fuente: http://devdocs.magento.com/guides/v2.0/architecture/archi_perspectives/domain_layer.html
Y un comentario sobre una pregunta relacionada declaró:
el uso del Repositorio le dará un modelo de datos del Producto (
Api/Data/Product), que es un modelo de Producto convertido en un DTO tonto. Algo a considerar, ya que son bastante diferentes.
Pero por lo que puedo ver, los objetos son los mismos en condiciones normales, solo los tipos de retorno por phpDoc difieren ( Magento\Catalog\Api\Data\ProductInterface/ Magento\Catalog\Model\Product)
fuente

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?. Sí: cuando necesita llamar al método de un modelo y no al deApi/Data/Productuno. ¿Es esto mejor? :)Para mí, no hay ninguna razón para usar el
loadmétodo sobre el métodogetById/get.No digo que tenga razón, pero así es como veo las cosas.
Ok, aquí está el
getByIdmétodo (elgetmétodo es similar pero usa el sku en lugar del id):Como puede notar el código que pegó:
Es parte de esta función.
Sin embargo, la condición adicional utiliza instancias almacenadas en caché para evitar una recarga adicional en caso de que haya utilizado previamente
getByIdelgetmétodo o para el mismo id (o sku en el caso delgetmétodo) .Puede pensar que una buena razón para usar
loadpodría ser evitar usar esas instancias almacenadas en caché (en cuyo caso, ¿podría ser una buena razón? Eso no lo sé) perogetByIdlosgetmétodos y tienen un$forceReloadparámetro que puede establecerse en verdadero a evite usar esas instancias de caché.Por eso, para mí, no hay una buena razón para usar
loadmétodogetByIdogetmétodos.fuente
Por favor, comprenda la diferencia entre repositorios y colecciones.
En su ejemplo, si usa repositorios, obtendrá una matriz
Magento\Catalog\Api\Data\ProductInterfacediferente de la de una colección deMagento\Catalog\Model\Product.Los repositorios y la interfaz de datos le brindan un alto nivel de interfaz que debería garantizarse como compatible en futuras versiones . Por eso es el enfoque sugerido.
Espero eso ayude.
fuente