J'ai suivi quelques tutoriels dans Magento 2 et cela me laisse un peu perplexe. Je peux voir qu’il existe essentiellement deux moyens de lire / écrire des entités commerciales:
Récupérer des données
Utiliser une approche d'usine
$object = $this->myFactory->create();
$object->load($myId);
Utiliser une approche de référentiel
$repo = $this->myRepository();
$object = $repo->getById($myId);
Enregistrer des données
Utiliser une approche d'usine
$object = $this->myFactory->create();
$object->load($myId);
$object->setData('something', 'somethingDifferent')->save();
Utiliser une approche de référentiel
$repo = $this->myRepository();
$object = $repo->getById($myId);
$object->setData('something', 'somethingDifferent');
$repo->save($object);
Je peux également voir qu’un référentiel et une classe d’usine peuvent être injectés à l’aide de l’injection de dépendance. C'est déroutant au moins pour moi.
Quand devrions-nous utiliser une approche de référentiel et une approche d'usine? Quelle est la meilleure pratique à suivre?
magento2
best-practice
factory
repository
Rajeev K Tomy
la source
la source
Réponses:
S'il existe un référentiel et qu'il répond à vos besoins, préférez-le toujours.
Les référentiels font partie des contrats de service (ce sont des implémentations d'interfaces dans
Api
), cela signifie qu'ils sont conçus comme une interface publique avec d'autres modules.Utiliser des référentiels pour un chargement complet
$model->load()
ne fait pas partie du contrat de service. J'avais une question sur ce sujet particulier, vous pourriez trouver les réponses utiles: y a-t-il jamais une raison de préférer $ model-> load () aux contrats de service?Utiliser des usines pour créer de nouvelles entités
Les référentiels ne sont pas fournis avec des méthodes permettant de créer une nouvelle entité. Dans ce cas, vous aurez besoin d'une fabrique. Mais utilisez l’usine pour l’ interface , par exemple
Magento\Catalog\Api\Data\ProductInterfaceFactory
- cela créera la bonne implémentation en fonction de la configuration DI.Ensuite, utilisez la
repository->save()
méthode pour le sauvegarder.Utilisez les usines de collecte si vous avez besoin de plus de contrôle
Ce qui suit n’est pas la meilleure pratique officielle de Magento, mais pour l’instant, les référentiels ne vous permettent pas de contrôler avec précision le contenu à charger. L'API de critères de recherche vous permet de définir des filtres, mais par exemple, il est impossible de sélectionner des attributs EAV particuliers ou de spécifier les tables d'index à joindre.
Ce sont des détails d'implémentation, cachés des API de contrat de service, mais souvent, ces détails d'implémentation importent et vous obtenez de mauvaises performances si vous les ignorez. Pour cette raison, dès que les dépôts me limitent, je n'hésite plus à utiliser les collections sous-jacentes.
la source
use the factory for the interface, such as Magento\Catalog\Api\Data\ProductInterfaceFactory - it will create the right implementation based on DI configuration.
c’est le point que je ne peux pas comprendre, les guides de développement n’introduisent pas InterfaceFactory , comment utiliser larepository->save()
méthode pour enregistrer de nouvelles entités? Je ne peux utiliser que la fabrique pour sauvegarder de nouvelles entités, pas un référentiel.Bonne question.
Même si les dépôts et les usines nous permettent d'accéder à une entité, je pense que nous devrions nous concentrer sur leur responsabilité .
Dans la documentation Magento : "Les factories sont des classes de service qui instancient des classes non injectables, c'est-à-dire des modèles qui représentent une entité de base de données. Elles créent une couche d'abstraction entre ObjectManager et le code de l'entreprise."
Extrait de l'article d'Alan Storm : "Un objet de référentiel est responsable de la lecture et de l'écriture de ses informations d'objet dans un magasin d'objets"
Mon interprétation est la suivante: si notre objectif est de travailler avec des objets non-injectables (appelés "nouveaux"), nous devrions utiliser Factories; si notre objectif est de rechercher / lire / écrire des objets dans un magasin d'objets, nous devrions utiliser des référentiels.
C’est mon approche idéaliste du sujet; N'oubliez pas que la mise en œuvre réelle peut nous obliger à tout gâcher, comme l'a souligné Alan.
Prendre plaisir.
la source
Je dirais que la voie à suivre consiste à commencer à utiliser des référentiels car ils permettent la séparation des codes entre la lecture / écriture de données et la logique métier.
Alan Storm a écrit un article très détaillé à ce sujet, expliquant comment utiliser les référentiels, mais aussi quelques inconvénients de cette nouvelle méthode: http://alanstorm.com/magento_2_understanding_object_repositories/
En outre, dans la documentation Magento, expliquant les avantages de cette nouvelle approche: http://devdocs.magento.com/guides/v2.0/extension-dev-guide/service-contracts/service-contracts.html
la source
$setup->updateTableRow(...);
ou les usines. Je ne suis pas sûr, mais il semble que les arguments en faveur de l’utilisation du niveau supérieur s’appliquent également à cette zone. Qu'en pensez-vous?J'espère que cette réponse pourrait également aider d'autres développeurs d'extensions.
Pour enregistrer le modèle, utilisez toujours Repository pour enregistrer toute entité. Si le modèle d'usine est utilisé pour enregistrer le modèle, il supprime tous les attributs non système liés à cette entité (client, produit, etc.).
Pour le chargement du modèle, le référentiel est la meilleure option pour obtenir un modèle à l'aide de la méthode getById ().
la source
Maintenant, charger, enregistrer, supprimer des méthodes (modèles) sont obsolètes. Nous pouvons donc utiliser un modèle de ressource ou un référentiel.
Magento utilise maintenant le concept de gestionnaire d'entités pour les opérations de sauvegarde, de suppression et de chargement.
Les modèles de ressources ont un objet de gestionnaire d'entités pour effectuer ces opérations.
la source