Magento 2 virtual type allows user to change the arguments of a specific injectable dependency and change the behavior of a particular class. This allows user to use a customized class without affecting other classes that have a dependency on the original.
Preference is used to override or rewrite existing / custom classes (Controller, Block & Helper). Preference using Dependency Injection to override or rewrite classes.
How To Define Preference : Preference is defined inside di.xml
Path : app/code/VendorName/ModuleName/etc/di.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:framework:Acl/etc/acl.xsd">
<preference for="Class Which Override" type="Custom Class By Which Override" />
</config>
Overriding (By Preference in di.xml) a method is not recommended because it can cause conflicts in the system and increase the complexity to upgrade.
Always try to user other extensibility options, such as event observers and plugins, when possible.
“A plugin or interceptor is a class that modifies or expand or edit the behavior of public class functions by intercepting a function call or set of code before, after or around that function call”
“Inserting code dynamically without changing original class behavior is called Plugin”
Plugins using design pattern “Interception”
Plugins Limitation : There are following below criteria where plugins can not used.
final classes
non public methods
static methods
constructor
virtual types
objects that are initialized before plugins loading
Both Plugins and Preferences are used to override the classes. However, Plugins are preferable than Preferences since plugins do not override the class logically instead it hooks our logic into the available classes. Finally, to modify or extend any existing business logic, it is better to use the plugins.
Preference is used for overriding class & Plugin is used for adding functionality before, after and around methods by using function call or set of code.
“Always prefer Plugin over Preference , while overriding or modify class”
module.xml file is a module’s naming configuration file, that is used to define module name, It is required to place this file into the below file path of module or custom module directory
The schema_version is no longer required since releasing Magento 2.3.3
There are following steps defined as follows:
module name declaration (moduleName) format : name=”Namespace_Modulename”
module’s version (setupVersion) format:
setup_version=”3.4.1″
There are three things in setup_module database table having three column
module : store module name as Namespace_Modulename
schema_version & data_version : The setup_version which is module version, this identify both things schema version data version as schema_version=3.4.1 & data_version=3.4.1
Module Naming convention format as follows:
Module Name: attribute can contain only [A-Za-z0-9_]
Setup Version: attribute can contain only [0-9.]
The xmlns attribute provides a location to the XMLSchema instance and the xsi:noNamespaceSchemaLocation attribute provides a path to an XSD (XML Schema Definition) file of a Magento 2 framework.