Magento 2 Plugin Before

Dando continuidade aos nossos estudos sobre Dependency Injection hoje falaremos de Magento 2 Plugin Before.

Plugin

Plugin é uma das grandes melhorias que a equipe do Magento adicionou no Magento 2. O Plugin é um interceptor que utilizamos para modificar o comportamento de métodos públicos. Antes, no Magento 1, todas as vezes que queríamos modificar o comportamento de um método de uma classe, nós éramos obrigados a fazer um rewrite da classe. Com o uso de Plugin, nós podemos modificar comportamento de métodos públicos de maneira simples sem efetuar qualquer rewrite da classe que está o método desejado.

No Magento 2 nós temos três tipos de plugins: before, after e around. Hoje, falaremos especificamente do plugin before

Magento 2 Plugin Before

O Plugin Before é utilizado para alterar os argumentos (parâmetros) de um método, retornando um argumento modificado.

Voltando ao nosso módulo, vamos modificar o nosso di.xml adicionando o seguinte nele:

<type name="Magento\Catalog\Model\Product">
    <plugin name="formage-learning-plugin" type="ForMage\Learning\Plugin\PluginOne" sortOrder="1" disabled="false" />
</type>

<type name="Magento\Catalog\Model\Product"> é a nossa classe alvo. A classe que tem o método que desejamos alterar o seu argumento.

<plugin name="formage-learning-plugin" o nome do nosso plugin.

<plugin type="ForMage\Learning\Plugin\PluginOne" a nossa classe Plugin. Onde faremos a interceptação do método e modificaremos o seu comportamento.

Em nosso caso, nós utilizaremos o Plugin Before para alterarmos o argumento do método setName()da classe Magento\Catalog\Model\Product

public function setName($name)
{
    return $this->setData(self::NAME, $name);
}

 

Assim, criamos o nosso plugin:

<?php

namespace ForMage\Learning\Plugin;

class PluginOne
{
    public function beforeSetName(\Magento\Catalog\Model\Product $subject, $name)
    {
        return 'Plugin Before '.$name;
    }
}

Como no código acima, criamos o diretório Plugin e adicionamos a classe PluginOne nele.

Como vamos interceptar o método setName()da classe Magento\Catalog\Model\Product e alterar o comportamento do seu argumento, adicionamos o método public function beforeSetName(\Magento\Catalog\Model\Product $subject, $name). O primeiro argumento é básico de um plugin before, é obrigatório o seu uso. O segundo argumento, é o próprio argumento do método que desejamos interceptar e modificar. Em return 'Plugin Before '.$name; vemos a alteração que faremos no argumento. Adicionamos o texto Plugin Before para ser concatenado com o nosso produto que carregaremos na página.

Após, vamos para o nosso controller e fazemos a seguinte alteração em nosso execute():

public function execute()
{
    $objecManager = \Magento\Framework\App\ObjectManager::getInstance();
    $product = $objecManager->create('Magento\Catalog\Model\Product')->load(2);
    $product->setName('Samsung Galaxy');
    $productName = $product->getName();
    var_dump($productName);
}

Instanciamos o Object Manager e fazemos o load do produto com o ID 2. Chamamos o método setName() e passamos qual deverá ser o nome do nosso produto. Então, chamamos o getName() para pegar o nome do produto e damos um var_dump nele. E seu resultado será:

4Mage - Trabalhando com Plugin Before

Então, de uma maneira bem simples, conseguimos interceptar o método setName() e alterar o comportamento de seu argumento.

Para mais informações sobre Plugins

Dúvidas? Posta aí!

 

 

 

 

 

 

Deixe um comentário

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