Eu gostaria de entender os atributos de extensão, por exemplo, para itens de cotação.
Não há problema em adicionar um atributo personalizado a uma entidade usando uma classe de instalação como no Magento 1, não é sobre isso que se trata.
No momento, a mágica me impressiona quando quero expor um atributo que foi adicionado por uma extensão por meio da API de entidades como um atributo de extensão.
ATUALIZAÇÃO : Eu sei como as fábricas regulares são geradas. Esta pergunta é sobre as fábricas especiais que instanciam as implementações geradas para as interfaces de atributo de extensão geradas.
Aqui estão os passos que eu tomo para fazê-lo funcionar. Estou adicionando esses itens para que quem tente responder não precise entrar nesses detalhes.
A minha pergunta é COMO ou POR QUE funciona.
Etapas para expor um atributo de extensão por meio de uma API da entidade:
- Crie um
etc/extension_attributes.xml
que adicione o atributo à interface da entidade - Crie um plug-in para adicionar o valor do atributo à
ExtensionAttributes
instância de entidades .
Para fazer o segundo ponto, a ExtensionAttributes
instância de entidades é necessária. Por esse motivo, o plug-in depende de uma fábrica, que o gerenciador de objetos fornece via DI.
Para o item de cotação, o exemplo Magento\Quote\Api\Data\CartItemExtensionFactory
deve ser usado.
Eu acho que o tipo dessa fábrica de alguma forma deve ser o gatilho para a geração mágica.
O Magento gera a interface correspondente \Magento\Quote\Api\Data\CartItemExtensionInterface
com os setters e getters para todos os atributos de extensão.
No entanto, parece não gerar a implementação concreta para essa interface. No momento, o PHPStorm não está vendo.
Como o Magento coleta as informações necessárias para gerar a classe? Como os métodos de interface gerados podem ser chamados em uma instância concreta? É uma classe que é gerada apenas na memória?
Estou feliz que funcione, mas isso não é realmente satisfatório. A capacidade do Magentos de usar atributos criados automaticamente por extensões é um fator chave para seu sucesso. Como desenvolvedor de módulos, acredito que preciso de um entendimento completo de todo o processo.
Se eu tivesse tempo, eu mesmo iria me aprofundar nisso, mas preferiria se pudesse obter uma explicação.
ATUALIZAÇÃO 2 : Demorou um pouco para ler \Magento\Framework\Api\Code\Generator\ExtensionAttributesInterfaceGenerator
e ler \Magento\Framework\Api\Code\Generator\ExtensionAttributesGenerator
. Agora, pelo menos, tenho uma ideia aproximada do que está acontecendo. Se ninguém me bater, escreverei uma descrição do processo completo em um ponto, pois acho que seria uma referência útil.