Anulación de clase de proxy de Magento 2

8

Necesito anular la clase \Magento\Catalog\Model\Product\Linkusando la preferencia, que funciona bien, pero la clase mencionada anteriormente tiene una clase proxy generada automáticamente \Magento\Catalog\Model\Product\Link\Proxy, que no incluye los nuevos métodos agregados en la anulación. ¿Hay alguna forma de inyectar esos métodos en la clase proxy?

EDITAR

Intenté profundizar en esto y descubrí que podemos inyectar proxy usando di.xml. Pero cuando intenté hacer eso, obtuve una excepción de que la clase Package\Module\Model\Class\Proxyno existe. Eso significa que el nuevo proxy que estoy tratando de generar no se genera automáticamente.

Taral Patoliya
fuente
Taral, ¿está su instancia de Magento configurada en modo desarrollador? De lo contrario, debe compilar di para poder generar proxy.
Ivan Chepurnyi
¿Por qué agrega métodos a esta clase?
KAndy
Ivan, mi instancia de magento está en modo desarrollador
Taral Patoliya
@KAndy Necesito agregar la funcionalidad exacta como productos relacionados, así que para hacer eso, necesito agregar algunos métodos para el nuevo tipo de enlace. Como he notado, cada tipo de enlace (relacionado, cross_sell, up-sell) tiene sus propios métodos en esa clase.
Taral Patoliya
no puede usted acaba de crear la clase de proxy a mano y conjunto en di.xmluna preferencia por \Magento\Catalog\Model\Product\Link\Proxyque Package\Module\Model\Class\Proxy?
Marius

Respuestas:

5

Después de leer los comentarios en los que has declarado:

He hecho algo similar y funcionó. Me he decidido con esa solución. pero quería generar una nueva clase de proxy que incluyera nuevos métodos. Como la clase proxy se usa para reducir la carga de inicializar la clase. ahora que la clase proxy ya no se usa, la clase original requerirá más carga del servidor. Pero creo que es insignificante.

Todo el problema que está tratando de resolver se puede hacer de una manera más elegante y menos dolorosa.

Si acaba de agregar nuevos métodos a la implementación existente, significa que no está cambiando el comportamiento de la clase original

  1. Debe evitar extender los métodos públicos de la clase existente a favor de crear su propia clase que use la original como dependencia
  2. Luego pasa tu clase en el lugar donde estabas usando la original

Esto le brinda tales beneficios secundarios:

  1. Codifica más fácilmente para probarlo (dependencia única sobre burlarse de todas las dependencias principales)
  2. No viola el principio de responsabilidad única
  3. No afecta el núcleo en lugares que no esperas
  4. Desacopla la lógica de su negocio de la implementación central
Ivan Chepurnyi
fuente
2

Logré generar el Proxy.phparchivo correcto que incluía mi nueva función agregando lo siguiente a mi 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>

Gracias @minlare por la ayuda

BroopDias
fuente