Tutorial : Plugin System in Magento 2

Magneto development services provider will explain plugin system in Magento 2. You will learn the way to use magento 2 plugins from the basics. Read and discover how professionals do it.

You will learn through this article how to use Magento 2 plugins that modify the behavior of all public functions without overloading the PHP class (block, model etc.) the container.

What are plugins?
To avoid having to override a class to modify a simple, Magento 2 plugins provides a mechanism to effectively manage this type of "rewriting" as well as to minimize conflicts between extensions.

Limitations plugins
To date, plugins can only be used for rewriting public methods, and are therefore subject to the following limitations:
1) final methods
2) non-public methods (protected or private)
3) static methods
4) Constructor ( _construct)
5) virtual Types

Types plugin
Magento provides three "types" of different plugins:
1) before: Change the arguments provided to a method
2) around: Change the behavior of a method
3) after: To "rework" the output of a method

Declaration of a plugin
The declaration of any plugin must be done in the file di.xml of your module. This file can be placed, depending on its use, either within the directory etcyour module (plugin to use the backend and frontend) or in etc/frontend

(limited use in frontend) or etc/adminhtml(limited use in backend):

<config> <typename="{observer_type}"> <pluginname="{plugin_name}"type="{plugin_type}"sortOrder="{plugin_order}"disabled="{plugin_disabled}"/> </type> </config>

The following can be specified:
1) observer_type: The class name, or virtual interface type you want to observe
2) plugin_name: The name of the plugin (eg. catalog_product_custom_plugin)
3) plugin_type: The name of the class or type used by the virtual module (ex.Vendor\Module\Plugin\ModelNamePlugin)
4) plugin_order: The order in which the plugin will run. Very useful to effectively manage the execution order of several plugins overloading the same method (see "Execution Order" below for details)
5) plugin_disabled: This parameter can be set trueif you want to disable the plugin

Execution order of the plugins

When multiple plugins rewriting the same method exist, the following order of performance will be followed by Magento:
1. The type of plugin beforethat has the highest priority (= the one with the least sortOrder)
2. The type of plugin aroundthat has the highest priority (= the one with the least sortOrder)
3. The other type of plugins beforebased on their priority (from smallest to largest sortOrder)
4. The other type of plugins aroundbased on their priority (from smallest to largest sortOrder)
5. The type of plugin afterthat has the lowest priority (= the one with the largest sortOrder)
6. The other type of plugins afterbased on their priority (largest to smallest sortOrder)

Example plugins
before
To change the settings passed to a function, it is necessary to create a methodbefore[methodName]in your plugin (which [methodName]corresponds to not the method you want to change, for example SetNamefor a method named setName).

The method created within your plugin parameter must take the class which includes the function you want to change and its various parameters. Example of method overloading setNameclass \Magento\Catalog\Model\Product:

<?php namespaceMy\Module\Plugin; classProductPlugin { publicfunctionbeforeSetName(\Magento\Catalog\Model\Product $subject, $name) { return['('. $name. ')']; } }

In this example, the product name passed in the argument $namewill be automatically enclosed in parentheses.
As you have probably noticed, the type of plugins beforehave returned an array containing all the parameters of the function.

around
To change the behavior of a function, a method around[methodName]must be created within your plugin (which [methodName]corresponds to not the method you want to change, for exampleSavefor a method named save).

The method created within your plugin parameter must take the class which includes the function you want to change and a second type parameter \Closurecorresponding to the original method.

Example of method overloading saveclass \Magento\Catalog\Model\Product:

<?php namespaceMy\Module\Plugin; classProductPlugin { publicfunctionaroundSave(\Magento\Catalog\Model\Product $subject, \Closure $proceed) { $returnValue= $proceed(); if($returnValue) { $this->doSomething(); } return$returnValue; } }

In this example, we execute line 9 will recover the original method and the return value. If it is defined, a third function, called here doSomething, will be executed.

Finally, we return line 13 returning the original method.

after-
To change the return of a function, it is necessary to create a method after[methodName]in your plugin (which [methodName]corresponds to not the method you want to change, for exampleGetNamefor a method named getName).

The method created within your plugin parameter must take the class which includes the function you want to change and a variable $resultthat will contain the result of the original method.

Example of method overloading getNameclass \Magento\Catalog\Model\Product:

publicfunctionafterGetName(\Magento\Catalog\Model\Product $subject, $result) { return'|'. $result. '|'; }

In this example, the return of the original method, which is here in the name of the product, will be surrounded by "| ".

The definition, limitations and uses of magento 2 plugins shared by magento developers from India for reference purpose only. You can ask for more info on the Magento 2 plugins in your comments.

Read More :
1) Top 7 Extension for Magento 2 Store
2) Hire Magento developers to get your website ready for mobile
3) Magento Pro Tip: Speed Up Content Deployment within Magento 2
4) Tutorial : Magento 2 Promotional Product Markers

 

Client Testimonials

  • Fabio Durso

    We found a reliable and efficient partner in NexSoftSys, ready to support our strategy of offshore software development. NexSoftSys has particularly impressed by the speed of response to any request for the development of software applications and for their maintenance.

  • Filipe

    We did hire full time Java developers from NexSoftSys, to help us to improve a time to market of a product. The software platform is based on Java & Extjs, and they are delivering the software on time and with success. We strongly recommend NexSoftSys as Reliable Development partner.

  • Steve

    Powerful solutions are given by NexSoftSys dedicated developers for my projects. They suggest solutions as per current market trend. Other than this, the team is always ready for any type of changes or update. That is the main reason that I would like to give my next project to them.

Copyright © 2016 - NexSoftSys All rights reserved