English:

Hi everyone, how are you getting on? I hope very fine!

Today I will talk about a very usefully subject in the development of Magento 2 extensions, the interceptor plugins. Think about when you need to add some data or some changes in a Magento 2 core class, for example in a block, the first thing comes to your mind is to extend this class, right? But Magento is a very modular plataform, so thinking in this way is very common to think we will have some extensions extending the same core class. That’s the problem, we need really to extend the class only to add a data in this class? The answer is, you can extend, but specifically in this case we can handle using a better way, the Magento “interceptors plugins”.

The “Interceptor Plugin” can extend or substitute the originals method of any class or interface. To declare a plugin for a class you have to declare in your di.xml the plugin interceptor in this way:

<type name=”{ObservedType}”>
<plugin name=”{pluginName}” type=”{PluginClassName}” sortOrder=”2″/>
</type>

The type name is the class that interceptor plugin is observing.

The plugin name is the name of your interceptor plugin, have to be unique.

The plugin type is the path of your interceptor plugin.

The sorOrder is the order of plugins that call the same method will run.

An example of interceptor plugin declaration:

<type name="Magento\ConfigurableProduct\Block\Product\View\Type\Configurable">
    <plugin name="igor_configurable"
            type="Igorludgero\Blog\Interceptors\Configurable"
            sortOrder="2"/>
</type>

Now we can declare our interceptor class, inside the “Interceptors” folder create the file Configurable.php.

namespace Igorludgero\Blog\Interceptors;

class Configurable {

}

In the interceptor plugins we can have three different types of methods, before, after and around. The difference between each method you can read in the official documentation in the final of this post.

For example in my interceptor I need to change the method’s result after the execution of original observed method, so I will use the after type. I will observe the method called “getAllowProducts”, and I will change the return of this method. In my interceptor plugin I declared the method like this:

public function afterGetAllowProducts(\Magento\ConfigurableProduct\Block\Product\View\Type\Configurable $subject, $result)
{
    return $this->helper->getAllowProducts($subject->getProduct()->getSku());
}

Look, I have to use the same method name but adding the word “after” in the end of method name, and change the first carachter of original method name to uppercase. The parameters in my method is my subject class object (in my case Magento\ConfigurableProduct\Block\Product\View\Type\Configurable) and a $result parameter that is the result of original method.

Now I am changing the result of the original method but I am not extending or overriding the original class, so I can have different extensions changing the same class, the same methods without conflicts.

The link of official documentation about interceptor plugins is http://devdocs.magento.com/guides/v2.0/extension-dev-guide/plugins.html.

I hope this post will help you in your next extensions, regards!

 

Português:

Olá pessoal, como estão? Espero que bem!
Hoje venho pra falar sobre um assunto bem útil quando falamos de desenvolvimento de extensões para Magento 2, os plugins interceptadores. Pense quando você precisa adicionar algum conteúdo em uma classe core do Magento, ou alterar o comportamento de um método, qual é a primeira coisa que vem a sua cabeça? Extender essa classe certo? Mas o Magento é uma plataforma modular e é bem comum de acontecer de uma loja possuir diversos módulos que venham a extender a mesma classe, certo? Este é o nosso problema, será que realmente a melhor solução seria extender a classe core do Magento? A resposta é você até pode, mas há uma solução melhor para este caso, utilizando os plugins interceptadores.

Um “plugin interceptador” pode estender ou substituir métodos originais de qualquer classe ou interface. Para declarar um plugin interceptador para sua classe você deve declará-lo em seu di.xml desta forma:

<type name=”{ObservedType}”>
<plugin name=”{pluginName}” type=”{PluginClassName}” sortOrder=”2″/>
</type>

O type name é a classe do core que o plugin estará observando.

O plugin name é o nome do seu plugin interceptador, esta nome deve ser único.

O plugin type é o sua classe plugin (o caminho).

O sorOrder é a ordem em que plugins que chamam o mesmo método irão ser executados.

Este é um exemplo da declaração de um plugin interceptador:

<type name="Magento\ConfigurableProduct\Block\Product\View\Type\Configurable">
    <plugin name="igor_configurable"
            type="Igorludgero\Blog\Interceptors\Configurable"
            sortOrder="2"/>
</type>

Agora podemos declarar nosso plugin interceptador, dentro da pasta “Interceptors” crie o arquivo Configurable.php com o seguinte código:

namespace Igorludgero\Blog\Interceptors;

class Configurable {

}

Em uma classe de plugin interceptador nós podemos ter três diferentes tipos de métodos, o before, after e o around. A diferença entre cada método você pode ver na documentação oficial acessando o link no fim do post.

Por exemplo no meu interceptador eu preciso mudar o resultado de um método depois da execução original, então vou utilizar o tipo after. Eu vou observar e alterar o método chamado “getAllowProducts”, e eu vou alterar o retorno deste método. No meu interceptador eu declarei o método dessa forma:

public function afterGetAllowProducts(\Magento\ConfigurableProduct\Block\Product\View\Type\Configurable $subject, $result)
{
    return $this->helper->getAllowProducts($subject->getProduct()->getSku());
}

Veja que eu utilizei o mesmo nome do método mas adicione a palavra “after” no ínicio do nome do método, e alterei o primeiro caracter do nome original do método para maiúsculo. Os parâmetros em nosso método são a o objeto da classe original (no meu caso Magento\ConfigurableProduct\Block\Product\View\Type\Configurable) e o $result que é o retorno do método original.

Agora eu estou alterando o resultado do método original mas eu não estou estendo ou sobrescrevendo a classe original, então eu posso ter diferentes extensões alterando as mesmas classes, mesmos métodos sem causar conflitos no código.

O link para a documentação oficial sobre os plugins interceptadores (em inglês) você pode ver no link a seguir: http://devdocs.magento.com/guides/v2.0/extension-dev-guide/plugins.html.

Espero que esse post seja útil em seu dia-a-dia de desenvolvedor, abraços!

Magento 2 – Interceptor Plugins

Igor Ludgero


PHP & Magento Developer from Brazil.


Post navigation


Leave a Reply

Your email address will not be published. Required fields are marked *

Pin It on Pinterest