Überschreiben der Magento 2-Proxyklasse

8

Ich muss die Klasse \Magento\Catalog\Model\Product\Linkmit den Einstellungen überschreiben , was gut funktioniert, aber in der oben genannten Klasse wird automatisch eine Proxy-Klasse generiert \Magento\Catalog\Model\Product\Link\Proxy, die die neuen Methoden, die in der Überschreibung hinzugefügt wurden, nicht enthält. Gibt es eine Möglichkeit, diese Methoden in die Proxy-Klasse einzufügen?

BEARBEITEN

Ich habe versucht, mich damit auseinanderzusetzen und festgestellt, dass wir Proxy mit di.xml injizieren können. Aber als ich das versuchte, bekam ich eine Ausnahme, dass die Klasse Package\Module\Model\Class\Proxynicht existiert. Das bedeutet, dass der neue Proxy, den ich generieren möchte, nicht automatisch generiert wird.

Taral Patoliya
quelle
Taral, ist Ihre Magento-Instanz in den Entwicklermodus versetzt? Wenn nicht, müssen Sie di kompilieren, damit der Proxy generiert wird.
Ivan Chepurnyi
Warum fügen Sie dieser Klasse Methoden hinzu?
KAndy
Ivan, meine Magento-Instanz ist im Entwicklermodus
Taral Patoliya
@KAndy Ich muss die genaue Funktionalität als verwandte Produkte hinzufügen. Dazu muss ich einige Methoden für den neuen Link-Typ hinzufügen. Wie ich bemerkt habe, hat jeder Link-Typ (related, cross_sell, up-sell) seine eigenen Methoden in dieser Klasse.
Taral Patoliya
Können Sie die Proxy-Klasse nicht einfach von Hand erstellen und di.xmleine Präferenz für \Magento\Catalog\Model\Product\Link\Proxyto festlegen Package\Module\Model\Class\Proxy?
Marius

Antworten:

5

Nach dem Lesen von Kommentaren, in denen Sie angegeben haben:

Ich habe ähnliche Dinge getan und es hat funktioniert. Ich habe mich mit dieser Lösung abgefunden. aber ich wollte eine neue Proxy-Klasse generieren, die neue Methoden enthielt. Da die Proxy-Klasse verwendet wird, um die Last der Initialisierung der Klasse zu reduzieren. Jetzt, da die Proxy-Klasse nicht mehr verwendet wird, nimmt die ursprüngliche Klasse etwas mehr Serverlast auf. aber ich denke, es ist vernachlässigbar.

Das gesamte Problem, das Sie zu lösen versuchen, kann auf elegantere und weniger schmerzhafte Weise durchgeführt werden.

Wenn Sie der vorhandenen Implementierung gerade neue Methoden hinzugefügt haben, bedeutet dies, dass Sie das Verhalten der ursprünglichen Klasse nicht ändern

  1. Sie sollten vermeiden, öffentliche Methoden vorhandener Klassen zu erweitern, um eine eigene Klasse zu erstellen, die die ursprüngliche als Abhängigkeit verwendet
  2. Bestehen Sie dann Ihre Klasse an der Stelle, an der Sie die ursprüngliche verwendet haben

Dies gibt Ihnen folgende Nebeneffekte:

  1. Sie codieren einfacher, um es zu testen (einzelne Abhängigkeit über das Verspotten aller Kernabhängigkeiten)
  2. Es verstößt nicht gegen das Prinzip der Einzelverantwortung
  3. Es wirkt sich nicht auf den Kern an Orten aus, die Sie nicht erwarten
  4. Es entkoppelt Ihre Geschäftslogik von der Kernimplementierung
Ivan Chepurnyi
quelle
2

Ich habe es geschafft, die richtige Proxy.phpDatei zu generieren , die meine neue Funktion enthält, indem ich meinem Modul Folgendes hinzugefügt habedi.xml

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

Danke @minlare für die Hilfe

BroopDias
quelle