Em Magento 2 Plugin Sort Order – Parte 2 vamos tratar da ordem de execução do Plugin Around junto com os plugins Before e After.
No artigo em que falamos sobre Plugin Around mostramos que o ele é dividido em duas partes: antes e depois do $proceed()
. Esse entendimento é importante para entender a sua ordem de execução com o sortOrder
.
Magento 2 Plugin Sort Order – Parte 2
Voltando o nosso módulo, efetuamos as seguintes modificações em nossa classe PluginOne:
<?php namespace ForMage\Learning\Plugin; class PluginOne { // public function beforeSetName(\Magento\Catalog\Model\Product $subject, $name) // { // return "Plugin Before | ".$name; // } // // public function afterGetName(\Magento\Catalog\Model\Product $subject, $result) // { // return $result. " | Plugin After"; // } // // public function aroundGetName(\Magento\Catalog\Model\Product $subject, callable $proceed) // { // echo " --- Before Proceed"."<br/>"; // $name = $proceed(); // echo $name."<br/>"; // echo " --- After Proceed"."<br/>"; // return $name; // } public function beforeExecute(\ForMage\Learning\Controller\Page\Index $subject) { echo "BEFORE SORT ORDER 10"."<br/>"; } public function afterExecute(\ForMage\Learning\Controller\Page\Index $result) { echo "AFTER SORT ORDER 10"."<br/>"; } public function aroundExecute(\ForMage\Learning\Controller\Page\Index $result, callable $proceed) { echo "AROUND BEFORE PROCEED 10"."<br/>"; $proceed(); echo "AROUND AFTER PROCEED 10"."<br/>"; } }
Além disso, comentamos toda a classe PluginTwo e PluginThree.
Ao executarmos a nossa rota, temos o seguinte resultado:
-
- Executa o plugin Before
- Executa o conteúdo do plugin Around antes do
$proceed()
- Executa o conteúdo principal do método interceptado.
- Executa o conteúdo do plugin Around depois do
$proceed()
- Executa o plugin After
Porém, a documentação do Magento fala algo de interessante sobre o plugin Around:
O plugin around afeta o fluxo de todos os plug-ins que são executados depois dele.
Vamos ao nosso módulo novamente e efetuamos a seguinte alteração na classe PluginTwo:
<?php namespace ForMage\Learning\Plugin; class PluginTwo { public function beforeExecute(\ForMage\Learning\Controller\Page\Index $subject) { echo "BEFORE SORT ORDER 20"."<br/>"; } public function afterExecute(\ForMage\Learning\Controller\Page\Index $result) { echo "AFTER SORT ORDER 20"."<br/>"; } public function aroundExecute(\ForMage\Learning\Controller\Page\Index $result, callable $proceed) { echo "AROUND BEFORE PROCEED 20"."<br/>"; $proceed(); echo "AROUND AFTER PROCEED 20"."<br/>"; } }
O resultado é:
O que vemos acima? Uma ordem de execução antes do conteúdo principal e outra depois do conteúdo principal.
Antes da execução do método principal, a ordem de execução é realizada do menor para o maior sortOrder
. Após a execução do método principal, a ordem de execução é do maior para o menor sortOrder
. Por isso, que na documentação do Magento é explicado que o plugin around afeta o fluxo de todos os plugins que são executados depois dele.
Para mais um teste, voltando a nossa classe PluginThree temos a seguinte alteração:
<?php namespace ForMage\Learning\Plugin; class PluginThree { public function beforeExecute(\ForMage\Learning\Controller\Page\Index $subject) { echo "BEFORE SORT ORDER 30"."<br/>"; } public function afterExecute(\ForMage\Learning\Controller\Page\Index $result) { echo "AFTER SORT ORDER 30"."<br/>"; } public function aroundExecute(\ForMage\Learning\Controller\Page\Index $result, callable $proceed) { echo "AROUND BEFORE PROCEED 30"."<br/>"; $proceed(); echo "AROUND AFTER PROCEED 30"."<br/>"; } }
Ao executar a nossa rota:
Assim, vimos como o plugin around afeta a ordem de execução de todos os plugins que são executados depois dele.
Dúvidas? Posta aí!
Um abraço!