In Magento 2, wenn Sie ein "Around" -Plugin erstellen
public function aroundRenderResult(
\Magento\Framework\Controller\ResultInterface $subject,
\Closure $proceed,
ResponseHttp $response
) {
//...
$proceed($response);
//...
}
Sie können mit dem nächsten Plugin fortfahren und die eigentliche ursprüngliche Methode aufrufen, indem Sie die übergebene $proceed
Methode aufrufen / aufrufen . Dies ist ein häufig vorkommendes Entwurfsmuster, das häufig in Middleware-Implementierungen von PHP Frameworks auftritt.
Es gibt jedoch einige Verwirrung hinsichtlich der Implementierungsdetails. Speziell
Wenn für ein
aroundPlugin
Objekt / eine Klasse zusätzlich zu einem einbefore
oder einafter
Plugin definiert wurde, wann werden sie in Bezug auf die Kette um Plugins ausgelöst?
dh werden alle Before-Methoden ausgelöst, bevor irgendwelche Around-Plugin-Methoden ausgelöst werden? Oder werden vor Plugins nur vor der endgültigen, tatsächlichen realen Methode ausgelöst?
Das spezifische Problem, das ich aufzuspüren versuche, ist, dass ich anscheinend kein Plugin an die Versandmethode eines Magento 2 Front-Controllers anhängen kann, wenn sich Magento im Ganzseiten-Caching-Modus befindet . Der Ganzseiten-Cache wird von einem Around-Plugin betrieben, das nicht aufgerufen wird $proceed($response)
. Ich habe versucht, einen Teil des Codes um diese Plugins herum zu studieren, und es fiel mir schwer, über das System nachzudenken, ohne zu wissen, wie es funktionieren soll.
dh - die Beschreibung auf der Seite dev docs scheint in diesem speziellen Fall ungenau zu sein. Es ist unklar, ob die Dokumentation falsch ist oder ob es sich um einen kürzlich eingeführten Fehler handelt, ob es sich um einen Randfall handelt oder ob meine Plugin-Konfiguration falsch ist.
Weiß jemand, durch direkte Beobachtung oder durch kulturelles Wissen, wie diese Priorisierung funktionieren soll?
quelle
\closure $proceed
vs.\callable $proceed
in einem Plugin verwenden sollst ? Das offizielle Dokument erwähnt nur\callable
und berührt nie\closure
.Antworten:
Plugins werden zuerst nach der Sortierreihenfolge und dann nach dem Methodenpräfix sortiert.
Beispiel: für Methode mit 3 Plugins (PluginA, PluginB, PluginC) mit folgenden Methoden und sortOrder:
Der Ausführungsablauf sollte folgendermaßen aussehen:
quelle
Aus dem Magento 2-Kochbuch:
quelle
Für mich sollte es funktionieren als:
Wenn Sie den Code von überprüfen, sehen
\Magento\Framework\Interception\Interceptor::___callPlugins()
Sie, dass die Plugins in der Reihenfolge aufgerufen werden, in der sie in der$pluginInfo
Variablen gespeichert sind. Diese Informationen wurden von automatisch generierten Methoden in Interceptors wie zWie Sie sehen, sind die
\Magento\Framework\Interception\PluginListInterface
Benutzeroberfläche und die\Magento\Framework\Interception\PluginList\PluginList
Standardimplementierung für die Sortierung der Plugins verantwortlich. Siehe _inheritPlugins: 152- MethodeFür mich hat diese Funktion zwei logische Fehler:
return $itemB['sortOrder'];
sollte seinreturn - $itemB['sortOrder']
;return 1;
sollte seinreturn 0;
Hoffe es wird dir helfen.
quelle