Datum: 30. Mai 2015 (angesichts der sich ändernden Art von Magento 2).
Magento 2 führte ein Plugin-Konzept ein , das über ein Interceptor-Pattern implementiert wurde .
Was in den Dokumenten nicht klar ist: Welche Klassen und Objekte in Magento können abgefangen werden? 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
. Dieser ältere Wiki-Artikel bietet einige Hinweise, wenn es heißt
Bitte beachten Sie, dass die Plug-in-Funktion nicht für Klassen gilt, die ohne Abhängigkeitsinjektion erstellt wurden, dh mit dem Operator new direkt erstellt wurden. -Final-Methoden, -Final-Klassen
Ist ein Objekt, das über die Abhängigkeitsinjektion erstellt wurde, zum Abfangen verfügbar? Muss das ObservedType
der Typ-Hinweis sein, der in der a- __construct
Methode bereitgestellt wird, oder kann es (sollte es sein?) Etwas anderes sein?
Ich versuche vor allem, mich mit dem zu beschäftigen, was mit einem Magento 2-Interceptor möglich und nicht möglich ist, bevor ich sie verwende.
quelle
Wir arbeiten an "@api" -Anmerkungen, um empfohlene Methoden zu kommentieren , die über Releases hinweg stabiler sind. Wenn Sie sich über Aufrüstbarkeit kümmern, zusätzlich zu dem, was kann ein Plugin definiert haben, sollten Sie auch überlegen , was sollte ein Plugin definiert haben. Wir empfehlen, keine non-@ api-Methoden abzufangen, aber manchmal wissen wir, dass dies die beste Option sein kann. (Das überlassen wir dem Entwickler.)
Offiziell können Sie öffentliche Methoden abfangen, die nicht endgültig sind. Private Methoden funktionieren definitiv nicht. Beim Abfangen aus dem Speicher wird derzeit eine abgeleitete Klasse erstellt, die die reale Klasse erbt (das Abhängigkeitsinjektionsframework erstellt Instanzen der generierten Klasse, wenn Sie nach einer neuen Instanz der realen Klasse fragen). Alles, was es ermöglicht, eine Unterklasse zu erstellen und die ursprüngliche Methode zu überschreiben, wird wahrscheinlich funktionieren. Es werden jedoch öffentliche Methoden empfohlen, die uns die Flexibilität geben, in Zukunft eine andere clevere Implementierung zu verwenden (die ohne guten Grund niemals realistisch sein würde). .
quelle
Ich weiß, das hat schon eine Antwort, aber es ist von vor 2 Jahren. Vielleicht hat sich in der Zwischenzeit einiges geändert.
Folgendes habe ich bisher gefunden.
Von der offiziellen Dokumentation und vom Eingraben in den Abfangprozess.
Ich werde andersherum antworten.
Was KANN NICHT 2. in Magento abgefangen
Aus dem offiziellen doc
Vom Herumgraben
\Magento\Framework\Phrase
)\Magento\Framework\ObjectManager\NoninterceptableInterface
. (Zum Beispiel\Magento\Framework\App\Cache\Proxy
und alle anderen automatisch generierten Proxys)quelle