Magento 2 ci offre un metodo molto interessante per modificare il comportamento di una classe, i Plugins (Interceptors), da non confondere con il termine Plugin utilizzato come sinonimo di estensione, modulo.

Un Plugin è una Classe in grado di modificare il comportamento di un metodo pubblico di un’altra Classe intercettando la chiamata ed eseguendo il codice prima, durante o dopo l’esecuzione del metodo intercettato.

Limiti

I plugin non possono essere utilizzati per modificare:

  • final function
  • final class
  • metodi non public
  • static function
  • __construct
  • Virtual types
  • Oggetti istanziati prima di Magento\Framework\Interception

Dichiarare un plugin

Per dichiarare un plugin è sufficiente richiamarlo nel file etc/di.xml

<config>
    <type name="{ObservedType}">
      <plugin name="{pluginName}" type="{PluginClassName}" sortOrder="1" disabled="false" />
    </type>
</config>

ad esempio

	<type name="Magento\Customer\Block\Widget\Taxvat">
		<plugin disabled="false" name="Ea_ItalianInvoice_Plugin_Magento_Customer_Block_Widget_Taxvat" sortOrder="10" type="Ea\ItalianInvoice\Plugin\Magento\Customer\Widget\Taxvat"/>
	</type>

Di seguito il significato degli elementi specificati

  • type name : la classe da intercettare
  • plugin name : un identificatore univoco per il plugin
  • plugin sortOrder : definisce la priorità di esecuzione rispetto ad altri plugin che modificano la stessa classe
  • plugin type : la classe del nostro Plugin

Metodi del Plugin

nel mio Plugin potrò di seguito creare i seguenti metodi:

  • beforeSetName (eseguito prima del metodo intercettato)
  • aroundSetName (eseguito prima e dopo il metodo intercettato)
  • afterSetName (eseguito dopo il metodo intercettato)

dove SetName è per convenzione il nome del metodo da intercettare.

Di seguito un esempio

namespace Ea\ItalianInvoice\Plugin\Magento\Customer\Widget;

class Taxvat
{
    public function beforeToHtml(\Magento\Customer\Block\Widget\Taxvat\Interceptor $block)
    {
        $block->setTemplate('Ea_ItalianInvoice::widget/taxvat.phtml');
    }
}