Substituição de classe proxy Magento 2

8

Eu preciso substituir a classe \Magento\Catalog\Model\Product\Linkusando a preferência, que está funcionando bem, mas a classe acima mencionada tem uma classe proxy gerada automaticamente \Magento\Catalog\Model\Product\Link\Proxy, que não inclui os novos métodos adicionados na substituição. Existe alguma maneira de injetar esses métodos na classe proxy?

EDITAR

Tentei me aprofundar nisso e descobri que podemos injetar proxy usando o di.xml. Mas quando tentei fazer isso, recebi uma exceção de que a classe Package\Module\Model\Class\ProxyNão existe. Isso significa que o novo proxy que estou tentando gerar não está sendo gerado automaticamente.

Taral Patoliya
fonte
Taral, sua instância do Magento está definida no modo de desenvolvedor? Caso contrário, você precisa compilar di para gerar proxy.
Ivan Chepurnyi
Por que você adiciona métodos a essa classe?
KAndy 16/05
Ivan, meu exemplo magento está no modo de desenvolvedor
Taral Patoliya
@KAndy Preciso adicionar a funcionalidade exata como produtos relacionados, portanto, para fazer isso, preciso adicionar alguns métodos para o novo tipo de link. como notei que todo tipo de link (relacionado, venda cruzada, venda adicional) tem seus próprios métodos nessa classe.
Taral Patoliya
você não pode simplesmente criar a classe proxy com a mão e conjunto em di.xmluma preferência para \Magento\Catalog\Model\Product\Link\Proxya Package\Module\Model\Class\Proxy?
Marius

Respostas:

5

Depois de ler os comentários nos quais você declarou:

Eu fiz uma coisa semelhante e funcionou. Eu me conformei com essa solução. mas eu queria gerar uma nova classe de proxy que incluísse novos métodos. Como a classe proxy é usada para reduzir a carga de inicialização da classe. agora como a classe proxy não é mais usada, a classe original levará um pouco mais de carga no servidor. mas eu acho que é insignificante.

Todo o problema que você está tentando resolver, pode ser feito de maneira mais elegante e menos dolorosa.

Se você acabou de adicionar novos métodos à implementação existente, significa que você não está alterando o comportamento da classe original

  1. Você deve evitar estender os métodos públicos da classe existente em favor da criação de sua própria classe que usa a original como uma dependência
  2. Em seguida, passe sua aula no local em que você estava usando a aula original

Isso oferece esses benefícios colaterais:

  1. Você codifica mais facilmente para testá-lo (dependência única ao zombar de todas as dependências principais)
  2. Não viola o princípio da responsabilidade única
  3. Não afeta o núcleo em lugares que você não espera
  4. Separa sua lógica de negócios da implementação principal
Ivan Chepurnyi
fonte
2

Consegui gerar o Proxy.phparquivo correto que incluía minha nova função adicionando o seguinte ao meu módulodi.xml

<type name="Magento\Catalog\Model\Product">
    <arguments>
        <argument name="productLink" xsi:type="object">Package\Module\Model\Product\Link\Proxy</argument>
    </arguments>
</type>

Obrigado @minlare pela ajuda

BroopDias
fonte