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/Product
uno. ¿Es esto mejor? :)Para mí, no hay ninguna razón para usar el
load
método sobre el métodogetById
/get
.No digo que tenga razón, pero así es como veo las cosas.
Ok, aquí está el
getById
método (elget
mé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
getById
elget
método o para el mismo id (o sku en el caso delget
método) .Puede pensar que una buena razón para usar
load
podría ser evitar usar esas instancias almacenadas en caché (en cuyo caso, ¿podría ser una buena razón? Eso no lo sé) perogetById
losget
métodos y tienen un$forceReload
pará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
load
métodogetById
oget
métodos.fuente
Por favor, comprenda la diferencia entre repositorios y colecciones.
En su ejemplo, si usa repositorios, obtendrá una matriz
Magento\Catalog\Api\Data\ProductInterface
diferente 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