Magento 2 How to create a plugin


Magento 2 Plugin is a technical plugin for your better writing code. Interception Plugin is referred to a little magento 2 extension that allows editing the behavior of any public class or method by intercepting a function call and running code either before or after or around the function call. By using this Magento 2 Plugin Interception, you can modify the behavior of a class while there is no need to change the class directly.

Maybe you still think the observers can help you do that fluently but some differences need to be pointed out. Particularly, not only create functions of a class using dependency injection but Interception plugin can also be confirmed with a sortOrder, that allows checking the chain and order on which plugins run. That is the reason why this plugin doesn’t make the class change and doesn’t have any conflict with one another


BENEFITS

For a module developer as you, Magento 2 Interception plugin allows:

  • Forwarding any method call that is used on an object manager controlled object and taken programmatic action
  • Modifying the return value of any method call that is used on an object manager controlled object
  • Modifying the arguments of any method call that is used on an object manager controlled object
  • Proceeding similarly when other modules are in progress of the same method in the same or predictable way.

PLUGIN'S RESTRICTION

What options Magento 2 Interception plugin doesn’t work with?

  • Objects that are instantiated before Magento\Framework\Interception is bootstrapped
  • Final methods
  • Final classes
  • Any class that contains at least one final public method
  • Non-public methods
  • Class methods (such as static methods)
  • __construct
  • Virtual types

CREATE PLUGIN


Step 1: Declaring a plugin in Magento 2

File path: app/code/MageCheck/Tutorial/etc/di.xml

<config xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:noNamespaceSchemaLocation='../../../../../lib/internal/Magento/Framework/ObjectManager/etc/config.xsd'> <type name='MageCheck\Tutorial\Controller\Index\Example'> <plugin name='MageCheck_Tutorial_Plugin' type='MageCheck\Tutorial\Plugin\ExamplePlugin' sortOrder='10' disabled='false' /> </type> </config>

Step 2: Create Plugin Controller

File path: app/code/MageCheck/Tutorial/Controller/Index/Example.php

<?php namespace MageCheck\Tutorial\Controller\Index; class Example extends \Magento\Framework\App\Action\Action { protected $title; public function execute() { echo $this->setTitle('Welcome'); echo $this->getTitle(); } public function setTitle($title) { return $this->title = $title; } public function getTitle() { return $this->title; } }

Step 3: Defining a Plugin

A plugin is a great way to expand or edit a public method’s behavior by using code before, after or around method. First of all, please get an object that provides permission to all public methods of the observed method’s class.

3 methods in Plugin

  • before - beforeDispatch()
  • around - aroundDispatch()
  • after - afterDispatch()

Before methods

Before methods are the first methods to run in an observed method, and these methods must have the same name to the observed one’s name while the prefix label is before.To apply the before methods for modifying the arguments of an observed method, you can return a modified argument. If there are multiple arguments, the returning will be carried out according to a range of those arguments. If the returning is invalid, that means the arguments for the observed method should not be modified.

File path: app/code/MageCheck/Tutorial/Controller/Index/Example.php

<?php namespace MageCheck\Tutorial\Plugin; class ExamplePlugin { public function beforeSetTitle(\MageCheck\Tutorial\Controller\Index\Example $subject, $title) { $title = $title . ' to '; echo __METHOD__ . '</br>'; return [$title]; } }

After methods

After methods start running right after the observed method is finished, and these methods must have the same name to the observed one’s name while the prefix label is “after”. After methods take a responsibility of editing the results of an observed method in the correct way and being required to have a return value.

File path: app/code/MageCheck/Tutorial/Controller/Index/Example.php

<?php namespace MageCheck\Tutorial\Plugin; class ExamplePlugin { public function afterGetTitle(\MageCheck\Tutorial\Controller\Index\Example $subject, $result) { echo __METHOD__ . '</br>'; return '<h1>'. $result . 'MageCheck.com' .'</h1>'; } }

Around methods

Around methods allows the code to run before and after the observed method, so you can override a method. These methods must have the same name to the observed one’s name while the prefix label is “around”.

Before the arrange of the original method’s argument, a callable from around methods will be called to the next method in the chain, that means the next plugin or the observed function is also called.

Note: In case the callable is not declared, the calling to neither the next plugin nor the original method is achieved.

File path: app/code/MageCheck/Tutorial/Controller/Index/Example.php

<?php namespace MageCheck\Tutorial\Plugin; class ExamplePlugin { public function aroundGetTitle(\MageCheck\Tutorial\Controller\Index\Example $subject, callable $proceed) { echo __METHOD__ . ' - Before proceed() </br>'; $result = $proceed(); echo __METHOD__ . ' - After proceed() </br>'; return $result; } }

This is the sample way to understand how to create a plugin in Magento 2!