No Magento 2, quando você cria um plug-in "around"
public function aroundRenderResult(
\Magento\Framework\Controller\ResultInterface $subject,
\Closure $proceed,
ResponseHttp $response
) {
//...
$proceed($response);
//...
}
você pode prosseguir para o próximo plug-in, culminando em chamar o método original real, chamando / chamando o $proceed
método passado . Esse é um padrão de design comum, geralmente visto nas implementações de middleware do PHP Frameworks.
Contudo - apresenta alguma confusão w / r / t aos detalhes da implementação. Especificamente
Se, além de um
aroundPlugin
, um objeto / classe tem umbefore
ouafter
plugin definido, quando é acionado em relação à cadeia de plugins?
ou seja, todos os métodos anteriores são acionados antes que qualquer método de plug-in em torno seja acionado? Ou será antes plugins única fogo antes da final, reais verdadeira incêndios método?
O problema específico que estou tentando rastrear é que não consigo conectar um plug-in ao método de despacho no controlador frontal do Magento 2 quando o Magento está no modo de cache de página inteira . O cache da página inteira opera por um plug-in que não chama $proceed($response)
. Eu tentei cavar parte do código em torno desses plugins e achei o sistema difícil de raciocinar sem saber como seus plugins se destinam.
ie - a descrição na página dev docs parece, nesta instância específica, imprecisa. Não está claro se a documentação está incorreta ou se é um bug recentemente introduzido, se é um caso de extrema importância ou se a configuração do meu plugin está errada.
Alguém sabe, por observação direta ou por conhecimento cultural, como essa priorização deve funcionar?
fonte
\closure $proceed
vs.\callable $proceed
em um plug-in? O documento oficial apenas menciona\callable
e nunca toca\closure
.Respostas:
Os plug-ins são classificados primeiro pela ordem de classificação e depois pelo prefixo do método.
Exemplo: para o método com 3 plugins (PluginA, PluginB, PluginC) com os seguintes métodos e sortOrder:
O fluxo de execução deve ser o seguinte:
fonte
No livro de receitas Magento 2:
fonte
Para mim, deve funcionar como:
Se você revisar o código,
\Magento\Framework\Interception\Interceptor::___callPlugins()
poderá ver os plug-ins chamados em ordem de armazenados na$pluginInfo
variável. Essas informações transmitidas do método gerado automaticamente em interceptores comoComo você vê a
\Magento\Framework\Interception\PluginListInterface
interface e a\Magento\Framework\Interception\PluginList\PluginList
implementação padrão responsáveis pela classificação dos plugins. Consulte o método _inheritPlugins: 152Para mim, essa função tem dois erros lógicos:
return $itemB['sortOrder'];
deveria serreturn - $itemB['sortOrder']
;return 1;
deveria estarreturn 0;
Espero que ajude você.
fonte