Frage

Datum:30. Mai 2015 (angesichts der sich ändernden Natur von Magento 2).

Magento 2 eingeführt ein Plugin-Konzept, umgesetzt über ein Abfangmuster.

Was aus den Dokumenten nicht klar hervorgeht, ist: Welche Klassen und Objekte in Magento sind „abfangbar“?Das heißt, Sie konfigurieren ein Plugin mit XML, das wie folgt aussieht

<config>
    <type name="{ObservedType}">
        <plugin name="{pluginName}" type="{PluginClassName}" sortOrder="1" disabled="true"/>
    </type>
</config>

Es ist jedoch nicht klar, welche Klassen als gültig sind ObservedType.Das älterer Wiki-Artikel gibt einige Hinweise, wenn es heißt

Bitte beachten Sie, dass die Plugin -Funktion nicht für -Klassen ohne Abhängigkeitsinjektion erstellt wurde, dh mit dem Operator neu, direkt, -finale Methoden, -finale Klassen

Ist beliebig Objekt, das über die Abhängigkeitsinjektion erstellt wurde, zum Abfangen verfügbar?Tut das ObservedType muss der in a angegebene Typhinweis sein __construct Methode, oder kann (sollte?) es etwas anderes sein?

Ich versuche hauptsächlich herauszufinden, was mit einem Magento 2-Interceptor möglich ist und was nicht, bevor ich anfange, sie zu verwenden.

War es hilfreich?

Lösung

Jede Klasse eines Magento-Moduls ist intercaptable.

Wie im aktuellen Wiki beschrieben, ist es durch endgültige Methoden und Klassen begrenzt

Nicht validiert, aber Klassen von Bibliotheken (lib-Verzeichnis) dürfen (/sollten) nicht abgefangen werden.

Die Einschränkung, wie das Objekt erstellt wurde, gilt meiner Meinung nach nicht mehr, zumindest wenn der Autoloader richtig konfiguriert ist.Und das sollte keine Rolle spielen, da sie nicht spontan erstellt werden, sondern erst, wenn der Generator ausgeführt wird.(Es geht also nur darum, dass der Magento-Autoloader der erste sein sollte)

Andere Tipps

Wir arbeiten an „@api“-Annotationen zum Kommentieren empfohlen Methoden, die über alle Releases hinweg stabiler sind.Wenn Sie sich Gedanken über die Aufrüstbarkeit machen, darüber hinaus dürfen Haben Sie ein Plugin definiert, sollten Sie sich auch überlegen, was sollen Habe ein Plugin definiert.Wir empfehlen nicht, Nicht-@api-Methoden abzufangen, aber manchmal wissen wir, dass dies die beste Option sein kann.(Das überlassen wir dem Ermessen des Entwicklers.)

Offiziell können Sie öffentliche Methoden abfangen, die nicht endgültig sind.Private Methoden funktionieren definitiv nicht.Aus dem Speicher funktioniert das Abfangen derzeit durch die Erstellung einer Nachkommenklasse, die die reale Klasse erbt (das Dependency-Injection-Framework erstellt Instanzen der generierten Klasse, wenn Sie nach einer neuen Instanz der realen Klasse fragen).Daher wird wahrscheinlich alles funktionieren, was es ermöglicht, eine Unterklasse zu erstellen und die ursprüngliche Methode zu überschreiben. Es werden jedoch öffentliche Methoden empfohlen, die uns die Flexibilität geben, in Zukunft eine andere clevere Implementierung zu verwenden (was ohne guten Grund realistischerweise nie passieren würde). .

Ich weiß, dass es dafür bereits eine Antwort gibt, aber sie ist von vor 2 Jahren.Vielleicht hat sich in der Zwischenzeit einiges geändert.

Hier ist, was ich bisher gefunden habe.
Von dem offizielle Dokumentation und davon, sich mit dem Abhörprozess auseinanderzusetzen.

Ich werde andersherum antworten.
Was KANN NICHT in Magento 2 abgefangen werden.
Aus dem offiziellen Dokument

  • Objekte, die instanziiert werden, bevor Magento\Framework\Interception gebootet wird (nicht sicher, wo sich dieser Punkt befindet)
  • Endgültige Methoden
  • Jede Methode aus endgültigen Klassen (da die generierte Interceptor-Klasse die ursprüngliche Klasse erweitern muss)
  • Jede Klasse, die mindestens eine letzte öffentliche Methode enthält
  • Nicht öffentliche Methoden (es könnte für geschützte Methoden funktionieren, aber das ist nicht „ethisch“, da es nicht öffentliche Methoden der Außenseite der Klasse zugänglich machen würde)
  • statische Methoden
  • __bauen
  • Virtuelle Typen

Vom Herumstöbern

  • Methoden in Klassen, die nicht über den Objektmanager instanziiert werden.(Beispiel \Magento\Framework\Phrase)
  • Klassen implementieren \Magento\Framework\ObjectManager\NoninterceptableInterface.(Zum Beispiel \Magento\Framework\App\Cache\Proxy und alle anderen automatisch generierten Proxys)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit magento.stackexchange
scroll top