Entendo que a maneira preferida de trabalhar entre os módulos no Magento 2 é usando os contratos de serviço.
Portanto, se eu quiser carregar um produto, eu uso o repositório do produto:
$product = $productRepository->getById($id);
que é por contrato retornando uma instância de Magento\Catalog\Api\Data\ProductInterface
.
Mas eu também poderia usar a maneira antiga, chamando a camada de domínio diretamente:
$product = $productFactory->create()->load($id);
Existe algum caso em que isso seria necessário ou útil?
Os devdocs dizem (destaque adicionado):
Um módulo pode chamar diretamente em outro módulo. Essa solução fortemente acoplada não é recomendada para a maioria das situações, mas às vezes é inevitável .
[...]
Sua estratégia para chamar o código da camada de domínio de outro módulo depende muito da configuração e necessidades exclusivas do seu sistema.
Fonte: http://devdocs.magento.com/guides/v2.0/architecture/archi_perspectives/domain_layer.html
E um comentário sobre uma pergunta relacionada afirmou:
usar o Repositório fornecerá um modelo de dados do Produto (
Api/Data/Product
), que é um modelo do Produto convertido em um DTO simplificado. Algo a considerar, pois são bem diferentes
Mas, tanto quanto posso ver, os objetos são os mesmos em condições normais, apenas os tipos de retorno por phpDoc diferem ( Magento\Catalog\Api\Data\ProductInterface
/ Magento\Catalog\Model\Product
)
fonte
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?
. Sim: quando você precisar chamar o método de um modelo e não o método deApi/Data/Product
um. Isso é melhor? :)Para mim, não há razão para usar o
load
método sobre ogetById
/get
método.Não digo que estou certo, mas eis como vejo as coisas.
Ok, então aqui está o
getById
método (oget
método é semelhante, mas usa o sku em vez do id):Como você pode observar o código que você colou:
Faz parte desta função.
No entanto, a condição extra usa instâncias em cache para evitar uma recarga extra caso você tenha usado anteriormente
getById
oget
método ou para o mesmo ID (ou sku no caso doget
método) .Você pode pensar que um bom motivo para usar
load
poderia ser evitar o uso dessas instâncias em cache (nesse caso, poderia ser um bom motivo? Que eu não sei), masgetById
osget
métodos e têm um$forceReload
parâmetro que pode ser definido como verdadeiro para evite usar essas instâncias de cache.É por isso que, para mim, não há uma boa razão para usar
load
métodosgetById
ouget
métodos.fonte
Por favor, entenda a diferença entre repositórios e coleções.
No seu exemplo, se estiver usando repositórios, você obterá uma matriz
Magento\Catalog\Api\Data\ProductInterface
diferente da obtenção de uma coleção deMagento\Catalog\Model\Product
.Repositórios e interface de dados oferecem um alto nível de interface que deve ser garantido como compatível em futuras versões . É por isso que é a abordagem sugerida.
Espero que ajude.
fonte