Remplacement de classe de proxy Magento 2


8

J'ai besoin de remplacer la classe à l' \Magento\Catalog\Model\Product\Linkaide de préférence, ce qui fonctionne bien, mais la classe mentionnée ci-dessus a une classe proxy générée automatiquement \Magento\Catalog\Model\Product\Link\Proxy, qui n'inclut pas les nouvelles méthodes ajoutées dans la substitution. Existe-t-il un moyen d'injecter ces méthodes dans la classe proxy?

ÉDITER

J'ai essayé de creuser cela et j'ai constaté que nous pouvons injecter un proxy en utilisant di.xml. Mais quand j'ai essayé de faire ça, j'ai eu une exception que la classe Package\Module\Model\Class\Proxyn'existe pas. Cela signifie que le nouveau proxy que j'essaie de générer n'est pas généré automatiquement.


Taral, votre instance Magento est-elle configurée en mode développeur? Sinon, vous devez compiler di afin de générer un proxy.
Ivan Chepurnyi

Pourquoi ajoutez-vous des méthodes à cette classe?
KAndy

Ivan, mon instance magento est en mode développeur
Taral Patoliya

@KAndy J'ai besoin d'ajouter la fonctionnalité exacte en tant que produits connexes, donc pour ce faire, je dois ajouter quelques méthodes pour le nouveau type de lien. comme j'ai remarqué que chaque type de lien (lié, cross_sell, up-sell) a ses propres méthodes dans cette classe.
Taral Patoliya

ne pouvez-vous pas simplement créer la classe proxy à la main et définir di.xmlune préférence pour \Magento\Catalog\Model\Product\Link\Proxyto Package\Module\Model\Class\Proxy?
Marius

Réponses:


5

Après avoir lu des commentaires dans lesquels vous avez déclaré:

J'ai fait quelque chose de similaire et cela a fonctionné. Je me suis arrangé avec cette solution. mais je voulais générer une nouvelle classe proxy avec de nouvelles méthodes incluses. Comme la classe proxy est utilisée pour réduire la charge d'initialisation de la classe. maintenant que la classe proxy n'est plus utilisée, la classe d'origine prendra plus de charge sur le serveur. mais je pense que c'est négligeable.

Tout le problème que vous essayez de résoudre peut être fait de manière plus élégante et moins douloureuse.

Si vous venez d'ajouter de nouvelles méthodes à l'implémentation existante, cela signifie que vous ne modifiez pas le comportement de la classe d'origine

  1. Vous devez éviter d'étendre les méthodes publiques de la classe existante au profit de la création de votre propre classe qui utilise celle d'origine comme dépendance
  2. Passez ensuite votre classe à l'endroit où vous utilisiez l'original

Cela vous donne de tels avantages secondaires:

  1. Vous codez plus facilement pour le tester (dépendance unique au lieu de se moquer de toutes les dépendances principales)
  2. Il ne viole pas le principe de la responsabilité unique
  3. Il n'affecte pas le cœur dans des endroits auxquels vous ne vous attendez pas
  4. Il dissocie votre logique métier de l'implémentation principale

2

J'ai réussi à générer le Proxy.phpfichier correct qui comprenait ma nouvelle fonction en ajoutant ce qui suit à mon moduledi.xml

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

Merci @minlare pour l'aide

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.