Magento 2 Plugin Sort Order – Parte 2

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:

4Mage - Ordem de Execução do Plugin Around

    • 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 é:

4Mage - Ordem de execução do plugion aound

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:

4Mage - Ordem de execução do Plugin Around

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!

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *