Ich möchte meinen Kopf mit Erweiterungsattributen, zum Beispiel für Angebotselemente, umschließen.
Es ist kein Problem, mit einer Setup-Klasse wie in Magento 1 ein benutzerdefiniertes Attribut zu einer solchen Entität hinzuzufügen. Darum geht es in dieser Frage nicht.
Im Moment überwältigt mich die Magie, wenn ich ein solches Attribut, das von einer Erweiterung über die Entities-API hinzugefügt wurde, als Erweiterungsattribut verfügbar machen möchte.
UPDATE : Ich weiß, wie die regulären Fabriken entstehen. Diese Frage bezieht sich auf die speziellen Factorys, die die generierten Implementierungen für die generierten Erweiterungsattributschnittstellen instanziieren.
Hier sind die Schritte, die ich unternehme, um es zum Laufen zu bringen. Ich füge diese hinzu, damit jeder, der versucht zu antworten, nicht auf diese Details eingehen muss.
Meine Frage ist WIE oder warum es funktioniert.
Schritte zum Anzeigen eines Erweiterungsattributs über eine Entitäts-API:
- Erstellen Sie eine
etc/extension_attributes.xml
, die das Attribut zur Entitätsschnittstelle hinzufügt - Erstellen Sie ein Plugin, um den Attributwert der Entitätsinstanz hinzuzufügen
ExtensionAttributes
.
Um den zweiten Punkt ausführen zu können, wird die ExtensionAttributes
Instanz des Entities benötigt. Aus diesem Grund ist das Plugin von einer Factory abhängig, die der Objektmanager über DI bereitstellt.
Für das Angebot muss ein Artikelbeispiel Magento\Quote\Api\Data\CartItemExtensionFactory
verwendet werden.
Ich denke, die Art dieser Fabrik muss der Auslöser für die Generationszauber sein.
Magento generiert dann \Magento\Quote\Api\Data\CartItemExtensionInterface
für alle Erweiterungsattribute die passende Schnittstelle mit den Setters und Getters.
Es scheint jedoch nicht die konkrete Implementierung für diese Schnittstelle zu generieren. Mindestens PHPStorm sieht es nicht.
Wie sammelt Magento die Informationen, die es zum Generieren der Klasse benötigt? Wie können die generierten Schnittstellenmethoden auf einer konkreten Instanz aufgerufen werden? Ist es eine Klasse, die nur im Speicher generiert wird?
Ich bin froh, dass es funktioniert, aber das ist nicht wirklich befriedigend. Die Fähigkeit von Magentos, von Erweiterungen automatisch erstellte Attribute zu verwenden, ist ein Schlüsselfaktor für den Erfolg. Als Modulentwickler glaube ich, dass ich ein gründliches Verständnis des gesamten Prozesses brauche.
Sollte ich Zeit haben, würde ich mich selbst damit befassen, aber ich würde es vorziehen, wenn ich nur eine Erklärung bekommen könnte.
UPDATE 2 : Nahm ein wenig Zeit zum Lesen durch \Magento\Framework\Api\Code\Generator\ExtensionAttributesInterfaceGenerator
und \Magento\Framework\Api\Code\Generator\ExtensionAttributesGenerator
. Jetzt habe ich zumindest eine ungefähre Vorstellung davon, was los ist. Wenn mich niemand schlägt, schreibe ich an einer Stelle eine Beschreibung des gesamten Vorgangs, da ich denke, dass dies eine nützliche Referenz wäre.