In the magento 1 I can move a class from /core
to /local
. Then used the file from /local
.
How to make this in Magento 2?
In Magento 2, you have to use preferences which is the closest of Magento 1 class rewrite. It is a way to provide a default implementation to classes.
For instance, if you want to rewrite the Magento\Catalog\Model\Product
class in your module, you can create the following di.xml
file:
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<preference for="Magento\Catalog\Model\Product" type="Vendor\ModuleName\Model\Product" />
</config>
This way, your class Vendor\ModuleName\Model\Product
will be used instead of the core Magento\Catalog\Model\Product
class.
Your model should look like this:
<?php
namespace Vendor\ModuleName\Model;
class Productextends \Magento\Catalog\Model\Product
{
public function theFunctionYouWantToRewrite()
{
// Do your custom stuff
}
}
Don't forget that Magento 2 also benefits from plugins, which are suggested if you're not working on the entire class level but more on a method level:
It allows you to execute code before, around, or after methods from the class you're hooking onto. Your plugin class does not replace the target class, and it is not an instance of it. You just have methods before{method}, around{method}, after{method} which get executed at the appropriate time in respect to {method} on the target class.
More information can be found here about the differences between the two: Magento2: what is the basic difference between plugin and preference?
There are no code pools like (core, community and local) in Magento 2 any more. If you need to replace a class a preference would be a way to go about it.
However before using preferences I'd suggest checking if you could achieve your goal by using a plugin if your changes are only on the method level.
Again depending on your specific circumstances a viable option could also be to only swap out the class in one location (checkout type definitions in di.xml)
Both Plugins and Preferences are helpful in overriding 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.
So, to modify or extend any existing business logic, it is better to use the plugins. Preferences are not recommended unless or otherwise there is no other option.