在Magento 2中覆盖接口

时间:2017-04-01 20:26:43

标签: php magento magento2

我在Magento 2.1.3安装中发现了一个缺陷,并将其缩小到我的数据库中的关键关系,这是Magento社区中的一个开放票据。

长话短说,我似乎可以解决问题的唯一方法是在核心Magento文件中更改常量。因为Magento 2使用依赖注入,我试图覆盖具有我需要更改的常量的接口。

我的问题在于我一直试图覆盖该界面,就像我对模型,布局等进行其他修改一样,但似乎没有任何效果。以下是我认为与此问题相关的几个文件。我还搜索高低,以更好地理解PHP中的接口是什么以及它与Magento 2生态系统的关系,但没有任何帮助。

注意:我提取了我们的供应商名称,并替换为[vendorname]以获得一些隐私。此外,我还有所需的registration.php文件和设置:升级运行没有错误。

应用程序/代码/ [VENDORNAME] / [VENDORNAME]客户/原料药/ AddressMetadataInterface.php

namespace Magento\Customer\Api;

/**
 * Interface for retrieval information about customer address attributes metadata.
 * @api
 */
interface AddressMetadataInterfaceRev extends MetadataInterface
{
const ATTRIBUTE_SET_ID_ADDRESS = 6;

const ENTITY_TYPE_ADDRESS = 'customer_address';

const DATA_INTERFACE_NAME = 'Magento\Customer\Api\Data\AddressInterface';
}

应用程序/代码/ [VENDORNAME] / [VENDORNAME]客户的/ etc / di.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/ObjectManager/etc/config.xsd">
      <preference for="Magento\Customer\Api\AddressMetadataInterface" type="[vendorname]\[vendorname]Customer\Api\AddressMetadataInterface" />
</config>

使用此代码。尝试运行setup时出现以下错误:di:compile

Fatal error: Cannot declare interface Magento\Customer\Api\AddressMetadataInterface, because the name is already in use in /Users/[username]/Sites/[sitename]/app/code/[vendorname]/[vendorname]Customer/Api/AddressMetadataInterface.php on line 13

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

看起来您需要更改首选项类的名称空间以匹配模块的名称空间而不是Magento的名称空间。然后你应该让你的类扩展原始的(\Magento\Customer\Api\AddressMetadataInterface),这样你只需要覆盖需要改变的常量:

应用/代码/ [YourVendor] / [模块名] /Api/AddressMetadataInterface.php     

namespace [YourVendor]\[ModuleName]\Api;

/**
 * Interface for retrieval information about customer address attributes metadata.
 * @api
 */
interface AddressMetadataInterface extends \Magento\Customer\Api\AddressMetadataInterface
{
    const ATTRIBUTE_SET_ID_ADDRESS = 2;

    const ENTITY_TYPE_ADDRESS = 'customer_address';

    const DATA_INTERFACE_NAME = 'Magento\Customer\Api\Data\AddressInterface';
}

重要提示

由于常量的性质以及如何在不实例化类(\Magento\Customer\Api\AddressMetadataInterface::DATA_INTERFACE_NAME)的情况下访问它们的值,我不知道这是否会解决您的问题,因为我刚才提到的每个用例都引用了原始类而不是你的覆盖。据我所知,类偏好仅在通过对象管理器或通过依赖注入请求类名时才起作用。可能值得一些调查。