Chciałbym owinąć głowę przy użyciu atrybutów rozszerzenia, na przykład w przypadku cytatów.
Nie ma problemu z dodaniem niestandardowego atrybutu do takiej encji przy użyciu klasy konfiguracji jak w Magento 1, nie o to chodzi w tym pytaniu.
W tej chwili magia mnie przytłacza, gdy chcę ujawnić taki atrybut, który został dodany przez rozszerzenie poprzez interfejs API jednostek jako atrybut rozszerzenia.
AKTUALIZACJA : Wiem, jak powstają zwykłe fabryki. To pytanie dotyczy specjalnych fabryk, które tworzą instancje wygenerowanych implementacji dla wygenerowanych interfejsów atrybutów rozszerzenia.
Oto kroki, które podejmuję, aby to działało. Dodam je, aby ktokolwiek próbował odpowiedzieć, nie musiał wchodzić w te szczegóły.
Moje pytanie brzmi: JAK lub DLACZEGO działa.
Kroki ujawniania atrybutu rozszerzenia za pośrednictwem interfejsu API encji:
- Utwórz,
etc/extension_attributes.xml
który dodaje atrybut do interfejsu encji - Utwórz wtyczkę, aby dodać wartość atrybutu do
ExtensionAttributes
instancji encji .
Aby wykonać drugi punkt, ExtensionAttributes
potrzebna jest instancja encji . Z tego powodu wtyczka zależy od fabryki, którą menedżer obiektów dostarcza przez DI.
Do wyceny Magento\Quote\Api\Data\CartItemExtensionFactory
należy użyć przykładu.
Myślę, że rodzaj tej fabryki musi w jakiś sposób wyzwalać magię generacji.
Magento następnie generuje pasujący interfejs \Magento\Quote\Api\Data\CartItemExtensionInterface
z ustawiającymi i pobierającymi dla wszystkich atrybutów rozszerzenia.
Wydaje się jednak, że nie generuje konkretnej implementacji tego interfejsu. Przynajmniej PHPStorm tego nie widzi.
W jaki sposób Magento gromadzi informacje potrzebne do wygenerowania klasy? Jak można wywoływać wygenerowane metody interfejsu w konkretnej instancji? Czy jest to klasa generowana tylko w pamięci?
Cieszę się, że to działa, ale to nie jest naprawdę satysfakcjonujące. Zdolność Magentos do używania atrybutów tworzonych automatycznie przez rozszerzenia jest jednym z kluczowych czynników sukcesu. Jako programista modułów uważam, że potrzebuję dokładnego zrozumienia całego procesu.
Gdybym miał czas, po prostu zagłębiłbym się w to sam, ale wolałbym, gdybym tylko mógł uzyskać wyjaśnienie.
AKTUALIZACJA 2 : Trochę czasu zajęło mi przeczytanie \Magento\Framework\Api\Code\Generator\ExtensionAttributesInterfaceGenerator
i \Magento\Framework\Api\Code\Generator\ExtensionAttributesGenerator
. Teraz mam przynajmniej ogólne pojęcie o tym, co się dzieje. Jeśli nikt mnie nie pobije, napiszę opis pełnego procesu w pewnym momencie, ponieważ uważam, że byłoby to przydatne odniesienie.