En Magento 2, cuando creas un complemento "alrededor"
public function aroundRenderResult(
\Magento\Framework\Controller\ResultInterface $subject,
\Closure $proceed,
ResponseHttp $response
) {
//...
$proceed($response);
//...
}
puede continuar con el siguiente complemento, que culmina con llamar al método original real, llamando / invocando el $proceed
método pasado . Este es un patrón de diseño común, a menudo visto en implementaciones de middleware PHP Frameworks.
Sin embargo, presenta cierta confusión con respecto a los detalles de implementación. Específicamente
Si, además de un
aroundPlugin
, un objeto / clase tiene unbefore
o unafter
complemento definido, ¿ cuándo se activan en relación con la cadena de complementos circundantes?
es decir, ¿se activarán todos los métodos anteriores antes de que se active alguno de los métodos de complementos? ¿O antes de que los complementos solo se activen antes de que se active el método real real final ?
El problema específico que estoy tratando de rastrear es que parece que no puedo obtener un complemento adjunto al método de envío del controlador frontal Magento 2 cuando Magento está en modo de almacenamiento en caché de página completa . La caché de página completa funciona mediante un complemento de entorno que no llama $proceed($response)
. He intentado profundizar en algunos de los códigos que rodean estos complementos y he encontrado que es difícil razonar sobre el sistema sin saber cómo se supone que funcionan esos complementos.
es decir, la descripción en la página de documentos de desarrollo parece, en esta instancia específica, ser inexacta. No está claro si la documentación es incorrecta, o si se trata de un error introducido recientemente, si se trata de un caso límite o si la configuración de mi complemento es incorrecta.
¿Alguien sabe, por observación directa o por conocimiento cultural, cómo se supone que funciona esta priorización?
fuente
\closure $proceed
vs.\callable $proceed
en un complemento? El documento oficial solo menciona\callable
y nunca toca\closure
.Respuestas:
Los complementos se ordenan primero por orden de clasificación y luego por prefijo de método.
Ejemplo: para el método con 3 complementos (PluginA, PluginB, PluginC) con los siguientes métodos y sortOrder:
El flujo de ejecución debe ser el siguiente:
fuente
Del libro de cocina de Magento 2:
fuente
Para mí debería funcionar como:
Si revisa el código
\Magento\Framework\Interception\Interceptor::___callPlugins()
, puede ver que los complementos se invocan en orden de almacenamiento en$pluginInfo
variable Esta información pasó del método generado automáticamente en interceptores comoComo puede ver, la
\Magento\Framework\Interception\PluginListInterface
interfaz y la\Magento\Framework\Interception\PluginList\PluginList
implementación predeterminada son responsables de la ordenación del complemento. Ver método _inheritPlugins: 152Para mí, esta función tiene dos errores lógicos:
return $itemB['sortOrder'];
debería serreturn - $itemB['sortOrder']
;return 1;
debiera serreturn 0;
Espero que te ayude.
fuente