Je comprends que la façon préférée de travailler entre les modules dans Magento 2 est d'utiliser les contrats de service.
Donc, si je veux charger un produit, j'utilise le référentiel produit:
$product = $productRepository->getById($id);
qui est par contrat renvoyant une instance de Magento\Catalog\Api\Data\ProductInterface
.
Mais je pourrais également utiliser l'ancienne méthode à la place, en appelant directement la couche de domaine:
$product = $productFactory->create()->load($id);
Y a-t-il des cas où cela serait nécessaire ou utile?
Les devdocs disent (surlignage ajouté):
Un module peut appeler directement un autre module. Cette solution étroitement couplée n'est pas recommandée dans la plupart des situations, mais est parfois inévitable .
[...]
Votre stratégie pour appeler le code de couche de domaine d'un autre module dépend fortement de la configuration et des besoins uniques de votre système.
Source: http://devdocs.magento.com/guides/v2.0/architecture/archi_perspectives/domain_layer.html
Et un commentaire sur une question connexe a déclaré:
l'utilisation du référentiel vous donnera un modèle de données produit (
Api/Data/Product
), qui est un modèle produit converti en DTO simplifié. Quelque chose à considérer, car ils sont très différents
Mais pour autant que je puisse voir, les objets sont les mêmes dans des conditions normales, seuls les types de retour par phpDoc diffèrent ( Magento\Catalog\Api\Data\ProductInterface
/ Magento\Catalog\Model\Product
)
la source
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?
. Oui: lorsque vous devez appeler la méthode d' un modèle et non celle d' un modèleApi/Data/Product
. Est-ce mieux? :)Pour moi, il n'y a aucune raison d'utiliser la
load
méthode sur la méthodegetById
/get
.Je ne dis pas que j'ai raison mais voici comment je vois les choses.
Ok alors voici la
getById
méthode (laget
méthode est similaire mais utilise le sku au lieu de l'id):Comme vous pouvez remarquer le code que vous avez collé:
Fait partie de cette fonction.
Cependant, la condition supplémentaire utilise des instances mises en cache pour éviter un rechargement supplémentaire au cas où vous auriez précédemment utilisé la
getById
ou laget
méthode pour le même id (ou sku dans le cas de laget
méthode) .Vous pouvez penser qu'une bonne raison d'utiliser
load
pourrait être d'éviter d'utiliser ces instances mises en cache (dans quel cas cela pourrait-il être une bonne raison? Que je ne sais pas) maisgetById
lesget
méthodes et ont un$forceReload
paramètre qui peut être défini sur true pour évitez d'utiliser ces instances de cache.C'est pourquoi pour moi, il n'y a aucune bonne raison d'utiliser la
load
méthodegetById
ou lesget
méthodes.la source
Veuillez comprendre la différence entre les référentiels et les collections.
Dans votre exemple, si vous utilisez des référentiels, vous obtiendrez un tableau
Magento\Catalog\Api\Data\ProductInterface
différent de celui d'une collection deMagento\Catalog\Model\Product
.Les référentiels et l'interface de données vous offrent un niveau d'interface élevé qui devrait être garanti comme compatible dans les futures versions . C'est pourquoi c'est l'approche suggérée.
J'espère que ça aide.
la source