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?
\closure $proceed
vs.\callable $proceed
in einem Plugin verwenden sollst ? Das offizielle Dokument erwähnt nur\callable
und berührt nie\closure
.