Pergunta

Não tenho certeza do que documentos estão dizendo.

Eu sei que eles são usados ​​para adicionar atributos (complexos ou não) via etc/extension_attributes.xml e consegui fazer com que o processo de compilação criasse uma interface com métodos personalizados de geração automática, mas isso é tudo.

Vejamos, por exemplo, algumas interfaces: link 1 do GitHub e link 2 do GitHub.Como posso usar atributos de extensão para adicionar determinados atributos em uma dessas interfaces?Não estou interessado em junções complexas.Apenas adicionando um atributo escalar, digamos "attr1" do tipo string.

O Data interfaces são a porta de entrada para o modelo...dados, então preciso entender como funciona a extensão dessas interfaces para usar o sistema corretamente.Frequentemente recebo um Data interface como um parâmetro em vez de um modelo real, e tudo bem, na verdade.Mas estou um pouco confuso sobre como as extensões funcionam.

Foi útil?

Solução

O atributo de extensão é uma forma de estender a interface.Tomemos como exemplo o primeiro link que você forneceu para ProductAttributeMediaGalleryEntryInterface.Se você olhar os métodos lá você verá que tem esse método

/**
 * Retrieve existing extension attributes object or create a new one.
 *
 * @return \Magento\Catalog\Api\Data\ProductAttributeMediaGalleryEntryExtensionInterface|null
 */
public function getExtensionAttributes();

Observe o tipo @return do método ProductAttributeMediaGalleryEntryExtensionInterface - esta é uma interface que seria gerada novamente se você definir o atributo de extensão para ProductAttributeMediaGalleryEntryInterface (por padrão, ele é gerado vazio, sem métodos).O nome do atributo que você cadastrou será utilizado para criar métodos de interface.

Vamos supor que você adicionou attr1 do tipo string.O que você pode fazer após a interface ser regenerada é acessá-la a partir da instância da interface.

$entity = $objectManager->get('..\ProductAttributeMediaGalleryEntryInterface')
$entity->getExtensionAttributes()->getAttr1();

Para definir o atributo, você precisaria instanciar a interface Extension Attributes

$extension = $objectManager->get('..\ProductAttributeMediaGalleryEntryExtensionInterface')
$extension->setAttr1('value');
$entity->setExtensionAttributes($extension)

Este último é o cenário padrão disponível e pode ser simplificado dependendo de como ExtensionInterface e a interface pai são implementadas.

[Atualizada]

Atributos customizados e atributos de extensão atendem a propósitos diferentes.

Atributos customizados são necessários para representar os atributos EAV da entidade.A maioria dos atributos EAV são dinâmicos:eles podem ser adicionados após a implantação do Magento por meio da interface de administração.É por isso que você não pode obter o preenchimento automático de código para atributos EAV:você não sabe sobre todos eles com antecedência.

No entanto, como desenvolvedor de extensões, você tem certeza de alguns atributos - aqueles que você criou no momento do desenvolvimento.Pode ser um novo campo no banco de dados, um campo no banco de dados relacionado ou um atributo EAV.Você pode registrá-los como atributos de extensão porque eles nunca mudam a menos que a base de código seja alterada.Você pode obter o preenchimento automático de código para eles.

Outras dicas

Para completar a resposta do @EugeneTulika, precisamos criar /etc/extension_attributes.xml :

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:noNamespaceSchemaLocation="urn:magento:framework:Api/etc/extension_attributes.xsd">
    <extension_attributes for="Magento\Catalog\Api\Data\ProductInterface">
        <attribute code="attr1" type="string" />
    </extension_attributes>
</config>

Então você pode definir seu novo atributo com o método setAttr1(), como abaixo:

/** @var ProductExtension $extensionAttributes */
$extensionAttributes = $product->getExtensionAttributes();
$extensionAttributes->setAttr1('super data');
$product->setExtensionAttributes($extensionAttributes);

Espero que isso possa ajudar alguém também :)

Vai

Licenciado em: CC-BY-SA com atribuição
Não afiliado a magento.stackexchange
scroll top