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');
}
}