Dans Magento 2, lorsque vous créez un plug-in "autour"
public function aroundRenderResult(
\Magento\Framework\Controller\ResultInterface $subject,
\Closure $proceed,
ResponseHttp $response
) {
//...
$proceed($response);
//...
}
vous pouvez passer au plugin suivant, aboutissant à l'appel de la méthode d'origine, en appelant / invoquant la $proceed
méthode transmise . Il s'agit d'un modèle de conception courant, souvent observé dans les implémentations de middleware PHP Frameworks.
Cependant, cela crée une certaine confusion avec les détails de la mise en œuvre. Plus précisément
Si, outre
aroundPlugin
un objet, un objet / une classe a défini un pluginbefore
ou unafter
plugin, quand est- ce qu'ils se déclenchent par rapport à la chaîne de plugins around?
c'est-à-dire que toutes les méthodes antérieures se déclencheront avant qu'une méthode autour du plugin ne se déclenche? Ou est-ce que les plugins avant ne seront activés qu’avant le déclenchement final de la méthode réelle et réelle ?
Le problème spécifique que je tente de localiser est qu’il me semble impossible d’attacher un plug-in à la méthode d’envoi du contrôleur frontal Magento 2 lorsque Magento est en mode de mise en cache pleine page . Le cache de page complet fonctionne par un plugin around qui n'appelle pas$proceed($response)
. J'ai essayé de fouiller dans une partie du code autour de ces plugins et j'ai trouvé difficile de raisonner le système sans savoir comment il est prévu que les plugins fonctionnent.
C'est-à-dire que la description sur la page des documents de développement semble, dans ce cas particulier, être inexacte. Il est difficile de savoir si la documentation est erronée, ou s'il s'agit d'un bogue récemment introduit, s'il s'agit d'un cas périphérique ou si la configuration de mon plugin est incorrecte.
Est-ce que quelqu'un sait, par observation directe ou par connaissance culturelle, comment cette priorisation est censée fonctionner?
la source
\closure $proceed
vs\callable $proceed
dans un plugin? Le document officiel mentionne seulement\callable
et ne touche jamais\closure
.Réponses:
Les plugins sont d'abord triés par ordre de tri, puis par préfixe de méthode.
Exemple: pour une méthode avec 3 plugins (PluginA, PluginB, PluginC) avec les méthodes suivantes et sortOrder:
Le flux d'exécution doit être le suivant:
la source
Dans le livre de recettes Magento 2:
la source
Pour moi, cela devrait fonctionner comme:
Si vous passez en revue le code de
\Magento\Framework\Interception\Interceptor::___callPlugins()
vous pouvez voir que les plugins appelés dans l'ordre de stockés dans la$pluginInfo
variable. Cette information a été transmise par une méthode générée automatiquement dans des intercepteurs tels queLorsque vous voyez l'
\Magento\Framework\Interception\PluginListInterface
interface et l'\Magento\Framework\Interception\PluginList\PluginList
implémentation par défaut responsables du tri des plugins. Voir la méthode _inheritPlugins: 152Pour moi cette fonction a deux erreurs logiques:
return $itemB['sortOrder'];
devrait êtrereturn - $itemB['sortOrder']
;return 1;
devrait êtrereturn 0;
J'espère que cela vous aidera.
la source