Wie überschreibt man Klassen in Magento 2?

Overriding Classes in Magento 2

Es gibt viele Möglichkeiten, Methoden und Klassen außer Kraft zu setzen. In den meisten Situationen ist die Verwendung einer Klasse vorzuziehen. Das Neuschreiben einer neuen Klasse kann zu Konflikten führen. Hierfür werden Plugins eingeführt. Alle Klassen werden durch ihre Schnittstellen definiert und durch di.xml-Dateien konfiguriert. Es gibt eine Abstraktions-Implementierungs-Zuordnung, die implementiert wird, wenn die Konstruktorsignatur einer Klasse ein Objekt über seine Schnittstelle anfordert. Das bedeutet, dass Schnittstellen verwendet werden sollten, wenn sie verfügbar sind, und dass die Abbildung angibt, welche Klasse initiiert werden sollte.

Nachstehend können die Pfade für die di.xml-Dateien innerhalb von VendorName/ModuleName angegeben werden:

/etc/di.xml
/etc/<area>/di.xml

Plugins:

Plugins können in dieser di.xml konfiguriert werden und sie werden vor, nach und um die Methoden herum aufgerufen, die unten als Beispiel für den Code der di.xml-Datei aufgeführt sind

<config>
    <type name="Magento\Catalog\Api\Data\ProductInterface">
        <plugin name="bay20_test_catalog_product" type="Bay20\Test\Plugin\Model\Product" />
    </type>
</config>
  • Vorher Methode

Vor dem Ausführen des Plugins ordnungsgemäß auf eine beobachtete Methode und hat die gleiche Anzahl von geänderten Argumente in einem Array zurück. Wenn die Methode das Argument für die beobachtete Methode nicht ändert, sollte sie einen Nullwert zurückgeben.

Nachfolgend ein Beispiel für eine „before“-Methode, die das Argument $price ändert, bevor sie es an die beobachtete „setPrice“-Methode weitergibt.

<?php
namespace Bay20\Test\Plugin\Model;
 
class Product
{
    public function beforeSetPrice(\Magento\Catalog\Model\Product $subject, $price)
    {
        $price += 10;
        return [$price];
    }
}

  • Nach der Methode

Nachdem die Methode ausgeführt wurde, wird nur noch die ursprüngliche Methode aufgerufen. Neben einem Klassenobjekt akzeptiert die Methode ein weiteres Argument und das ist das Ergebnis, das auch zurückgegeben werden muss. Die Methode, die erweitert wird, muss den gleichen Namen mit dem Präfix „after“ haben.

Nachfolgend ein Beispiel für eine After-Methode, die den Rückgabewert $result eines beobachteten Methodenaufrufs ändert.

<?php
namespace Bay20\Test\Plugin\Model;
 
class Product
{
    public function afterGetName(\Magento\Catalog\Model\Product $subject, $result)
    {
        $result .= ' Suffix';
        return $result;
    }
}

  • Rund um die Methode

Wenn Sie eine Methode aufrufen, wird die ursprüngliche Methode umschlossen und ermöglicht die Ausführung von Code vor und nach dem Aufruf der ursprünglichen Methode. Neben einem Klassenobjekt ist die Methode, die ein weiteres Argument akzeptiert, aufrufbar, so dass andere Plugins sie in der Kette aufrufen können. Die Methode, die erweitert wird, muss den gleichen Namen mit dem Präfix „around“ haben.

<?php
namespace Bay20\Test\Plugin\Model;
 
class Product
{
    public function aroundSave(\Magento\Catalog\Model\Product $subject, \callable $proceed)
    {
        // before save
        $result = $proceed();
        // after save
 
        return $result;
    }
}

Schlussfolgerung:

Es gibt mehr als eine Möglichkeit, Klassen und Methoden zu überschreiben, und die Wahl der richtigen Methode hängt von der jeweiligen Situation ab. Die Verwendung einer Klassenpräferenz als Überschreibungsmethode mag zwar der einfachste Weg sein, der in den meisten Situationen funktioniert, ist aber die Ursache vieler Konflikte, wenn verschiedene Module versuchen, dieselben Klassen und dieselben Methoden zu überschreiben.

Bitte kontaktieren Sie uns unter manish@bay20.com oder rufen Sie uns unter +91-8800519180 an, wenn Sie Unterstützung für Magento 2 benötigen. Sie können auch die Magento2-Entwicklungsseite besuchen, um die von uns angebotenen Dienstleistungen zu überprüfen.