En Magento2 Un Plugin o Interceptor es una clase que nos permite manipular el núcleo sin necesidad de tocar ninguno de sus ficheros.
Para poder realizar esta tarea el Plugin utiliza los siguientes prefijos en los métodos que necesita modificar:
- before: es ejecutado antes que el método observado sea llamado.
- after: ejecuta el código después de que el método observado sea llamado.
- around: nos permitirá ejecutar código antes y después.
Estos métodos nos permitirán sustituir o manipular el comportamiento por defecto de métodos públicos de cualquier clase o interfaz.
Por lo que un Plugin cambiará el comportamiento de una clase o método pero nunca cambiará la clase en si misma.
Este proceso al que llamaremos interception disminuye los conflictos entre extensiones que cambien el comportamiento de la misma clase o método.
Magento llamará a estos interceptores secuencialmente dependiendo del orden que le tenga asignado.
Los Plugins no pueden ser utilizados en:
- métodos final()
- clases final
- métodos que no sean públicos
- métodos estáticos
- __construct()
- Virtual Types definidos en nuestro di.xml
Declaración del Plugin
Lo declararemos en el fichero etc/di.xml (dependecy injection) que es el fichero que controla dependencias en Magento2.
- type name: Será la clase o interfaz que nuestro Plugin va a observar.
- plugin name: Es un nombre aleatorio que identificará a nuestro Plugin.
- plugin type: Es el nombre de la clase del Plugin o su tipo virtual (virtualType).
- sortOrder: Orden en el que se ejecutará en caso de que existan otros Plugins.
- disabled: desactiva o activa el Plugin.
1 2 3 4 5 |
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd"> <type name="Magento\Customer\Model\Session"> <plugin name="Ilovemarketing_Desarrollo" type="Ilovemarketing\Desarrollo\Plugin\MsgUsersPlugin" sortOrder="1" disabled="false" /> </type> </config> |
Definiendo nuestro Plugin
Vamos a incluir el prefijo after al método setCustomerDataAsLoggedIn() de nuestra clase session en la libreria Customer de Magento2.
Nuestro método sera ejecutado después de se ejecutado setCustomerDataAsLoggedIn() por lo que es necesario que tenga un valor de retorno.
Todos los métodos after tienen que acceder a todos los argumentos del método observado.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
<?php namespace Ilovemarketing\Desarrollo\Plugin; use Magento\Framework\Message\ManagerInterface; use Magento\Customer\Model\Session as CustomerSession; use Magento\Customer\Api\CustomerRepositoryInterface; class MsgCustomerPlugin { protected $_managerInterface; public function __construct( ManagerInterface $managerInterface, CustomerRepositoryInterface $customerRepository ) { $this->_managerInterface = $managerInterface; $this->_customerRepository = $customerRepository; } public function afterSetCustomerDataAsLoggedIn(CustomerSession $customerSession, $result) { $customerId = $customerSession->getCustomerId(); $customer = $this->_customerRepository->getById($customerId); if($customer->getId()){ $this->_managerInterface->addSuccess(__("welcome Back: ").$customer->getFirstName().' '.$customer->getLastName()); } return $result; } } |
En caso de que el Plugin definido en nuestro fichero de dependencias di.xml no exista, Magento2 mostrará un error y generará un reporte en var/report/
Los interceptores son generados en generated/code/
El resultado de nuestro Plugin es el siguiente: