Я хотів би обернути голову, використовуючи атрибути розширення, наприклад, для цитат.
Немає проблеми додавати спеціальний атрибут до такої сутності, використовуючи клас налаштування, як у Magento 1, це питання не стосується цього питання.
На даний момент магія переповнює мене, коли я хочу розкрити такий атрибут, який був доданий розширенням через API сутності як атрибут розширення.
ОНОВЛЕННЯ : Я знаю, як створюються штатні заводи. Це питання стосується спеціальних заводів, які створюють створені реалізації для інтерфейсів створених атрибутів розширення.
Ось кроки, які я вживаю, щоб змусити його працювати. Я додаю це, тому тому, хто намагається відповісти, не потрібно вдаватися до цих деталей.
Моє запитання - ЯК чи ЧОМУ це працює?
Етапи розкриття атрибуту розширення за допомогою API сутності:
- Створіть,
etc/extension_attributes.xml
що додає атрибут до інтерфейсу сутності - Створіть плагін, щоб додати значення атрибута до
ExtensionAttributes
екземпляра сутностей .
Для того, щоб зробити другий пункт, ExtensionAttributes
потрібен екземпляр сутності . З цієї причини плагін залежить від фабрики, яку менеджер об'єктів постачає через DI.
Для котирування товару Magento\Quote\Api\Data\CartItemExtensionFactory
слід використовувати приклад .
Я думаю, що тип цієї фабрики якось повинен стати пусковим механізмом для магії покоління.
Потім Magento генерує відповідний інтерфейс \Magento\Quote\Api\Data\CartItemExtensionInterface
із сеттерами та getters для всіх атрибутів розширення.
Однак, схоже, це не генерує конкретної реалізації цього інтерфейсу. В оренді PHPStorm його не бачить.
Як Magento збирає інформацію, необхідну для створення класу? Як можна викликати створені методи інтерфейсу на конкретному екземплярі? Це клас, який просто генерується лише в пам'яті?
Я щасливий, що це працює, але це насправді не задовольняє. Можливість Magentos використовувати атрибути, створені автоматично розширеннями, є одним з ключових факторів його успіху. Як розробник модулів, я вважаю, що мені потрібно глибоке розуміння всього процесу.
Якщо я маю час, я б просто розібратися в цьому сам, але я вважаю за краще, якби я міг отримати пояснення.
ОНОВЛЕННЯ 2 : Витратили трохи часу для читання \Magento\Framework\Api\Code\Generator\ExtensionAttributesInterfaceGenerator
та \Magento\Framework\Api\Code\Generator\ExtensionAttributesGenerator
. Тепер я, принаймні, маю грубе уявлення про те, що відбувається. Якщо мене ніхто не переможе, я напишу опис повного процесу в один момент, оскільки, думаю, це буде корисним посиланням.