Overriding Magento_SalesRule ResourceModel by preferences throws error: Type Error occurred when creating object

Overriding Magento_SalesRule ResourceModel by preferences throws error: Type Error occurred when creating object

debug.log 中的错误消息:

[2020-11-10 07:57:17] main.CRITICAL: Type Error occurred when creating object: Magento\SalesRule\Model\ResourceModel\Rule, Argument 3 passed to Magento\SalesRule\Model\ResourceModel\Rule::__construct() must be an instance of Magento\SalesRule\Model\ResourceModel\Coupon, instance of RM\SameCouponMultipleDiscounts\Model\ResourceModel\Coupon given, called in /home/rehan/lab/testrm/vendor/magento/framework/ObjectManager/Factory/AbstractFactory.php on line 116 [] []

我正在尝试覆盖:Magento\SalesRule\Model\ResourceModel\Coupon。php 以删除 'unique coupon' 限制:

$this->addUniqueField(['field' => 'code', 'title' => __('Coupon with the same code')]);

来自 construct() 方法。

我的 app/code/Vendor/Module/Model/ResourceModel/Coupon.php 看起来像:

<?php
/**
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */
namespace Vendor\Module\Model\ResourceModel;

use Magento\Framework\Model\AbstractModel;

/**
 * SalesRule Resource Coupon
 *
 * @author      Magento Core Team <core@magentocommerce.com>
 */
class Coupon extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb implements
    \Magento\SalesRule\Model\Spi\CouponResourceInterface
{
    /**
     * Constructor adds unique fields
     *
     * @return void
     */
    protected function _construct()
    {
        $this->_init('salesrule_coupon', 'coupon_id');
    }
}

我的 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\SalesRule\Model\ResourceModel\Coupon" type="Vendor\Module\Model\ResourceModel\Coupon" />
</config>

我已尝试清除缓存、生成文件夹并执行 setup:di:compile 但我仍然收到相同的错误。

你应该让你的覆盖 class 扩展原来的 class 这样另一个原生的 class 依赖注入原来的 class 可以识别你的覆盖。

改变

class Coupon extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb implements
    \Magento\SalesRule\Model\Spi\CouponResourceInterface

进入

class Coupon extends \Magento\SalesRule\Model\ResourceModel\Coupon

但不推荐使用首选项,您可以尝试寻找更好的方法。