Je voudrais faire le tour de ma tête en utilisant des attributs d'extension, par exemple pour les éléments de devis.
Ce n'est pas un problème d'ajouter un attribut personnalisé à une telle entité en utilisant une classe d'installation comme dans Magento 1, ce n'est pas de cela qu'il s'agit.
En ce moment, la magie me submerge quand je veux exposer un tel attribut qui a été ajouté par une extension via l'API d'entités comme attribut d'extension.
MISE À JOUR : Je sais comment les usines régulières sont générées. Cette question concerne les usines spéciales qui instancient les implémentations générées pour les interfaces d'attribut d'extension générées.
Voici les étapes que je prends pour le faire fonctionner. J'ajoute ces informations afin que quiconque tente de répondre n'ait pas besoin d'entrer dans ces détails.
Ma question est COMMENT ou POURQUOI cela fonctionne.
Étapes pour exposer un attribut d'extension via une API d'entité:
- Créer un
etc/extension_attributes.xml
qui ajoute l'attribut à l'interface d'entité - Créez un plugin pour ajouter la valeur d'attribut à l'
ExtensionAttributes
instance d' entités .
Pour faire le deuxième point, l' ExtensionAttributes
instance d' entités est nécessaire. Pour cette raison, le plugin dépend d'une usine, que le gestionnaire d'objets fournit via DI.
Pour l'exemple d'article de devis Magento\Quote\Api\Data\CartItemExtensionFactory
doit être utilisé.
Je suppose que le type de cette usine doit en quelque sorte être le déclencheur de la magie de génération.
Magento génère ensuite l'interface correspondante \Magento\Quote\Api\Data\CartItemExtensionInterface
avec les setters et les getters pour tous les attributs d'extension.
Cependant, il ne semble pas générer l'implémentation concrète de cette interface. Au bail, PHPStorm ne le voit pas.
Comment Magento collecte-t-il les informations dont il a besoin pour générer la classe? Comment appeler les méthodes d'interface générées sur une instance concrète? Est-ce une classe qui est uniquement générée en mémoire?
Je suis content que ça marche, mais ce n'est pas vraiment satisfaisant. La capacité de Magentos à utiliser des attributs créés automatiquement par des extensions est un facteur clé de son succès. En tant que développeur de modules, je pense avoir besoin d'une compréhension approfondie de l'ensemble du processus.
Si j'avais le temps, je creuserais cela moi-même, mais je préférerais que je puisse simplement obtenir une explication.
MISE À JOUR 2 : A pris un peu de temps pour lire \Magento\Framework\Api\Code\Generator\ExtensionAttributesInterfaceGenerator
et \Magento\Framework\Api\Code\Generator\ExtensionAttributesGenerator
. Maintenant, j'ai au moins une idée approximative de ce qui se passe. Si personne ne me bat, j'écrirai une description du processus complet à un moment donné, car je pense que ce serait une référence utile.