在这篇博客中,我们将看到如何重写核心块、模型、控制器和自定义magento方法。

在magento中使用依赖注入可以轻松管理重写,etc/ folder中的di.xml是管理它的配置文件。

 

重写Model

让我们看看如何覆盖Magento/Customer/Model/Customer模型

创建Magease/Hello/etc/di.xml文件

<?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\Customer\Model\Customer" type="Magease\Hello\Model\Rewrite\Customer\Customer" />
</config>

接下来创建Magease\Hello\Model\Rewrite\Customer\Customer.php文件

<?php
namespace Magease\Hello\Model\Rewrite\Customer;

class Customer extends \Magento\Customer\Model\Customer
{
public function loadByEmail($customerEmail)
{
//echo $customerEmail.'<br/>'; exit;
// Do your stuff here
return parent::loadByEmail($customerEmail);
}
}

要注意的是我们创建的类路径是\Rewrite\Customer\Customer.php这是一种模仿的写法,在重写类时,创建一个Rewrite文件夹,并使类路径与您的扩展类相同

 

重写 Resource Model

在资源模型中添加以下代码

<preference for="Magento\Customer\Model\ResourceModel\Customer" type="Magease\Hello\Model\Rewrite\Customer\ResourceModel\Customer\Customer" />
<?php
namespace Magease\Hello\Model\Rewrite\Customer\ResourceModel\Customer;

class Customer extends \Magento\Customer\Model\ResourceModel\Customer
{
public function loadByEmail(\Magento\Customer\Model\Customer $customer, $email)
{
//echo 'resource';exit;
parent::loadByEmail($customer,$email);
}
}

该方法也用于重写块、控制器。在magento1中,控制器重写与块、模型重写的方法不同,但在magento2中它是相同的

在magento重写中重要的一点是,您应该始终在其中使用parent:: function,并从父类复制尽可能少的代码。例如,你正在重写一个函数,它有100行代码。一种简单的方法是将100行代码复制到你自己的类,并在上面写下你的自定义方法。另一种方法是调用parent:: 函数和拷贝尽可能少的代码。第二种方法才是更正确的选择。