Вопрос

Я пытаюсь создать плагин для расширения \Magento\SalesRule\Model\Validator

Это работает как шарм, но проблема в том, что мне нужно использовать Magento\SalesRule\Model uleFactory.

Я попытался создать __constructor в классе плагина и добавить туда RuleFactory посредством внедрения зависимостей, как описано в Руководстве разработчика Magento 2, которое выглядело следующим образом:

Весь класс плагина «Валидатор» теперь выглядит так:

class Validator{
    /**
     * @var \Magento\SalesRule\Model\RuleFactory
     */
    private $ruleFactory;

    /**
    * @param \Magento\SalesRule\Model\RuleFactory $ruleFactory
     */
    public function __constructor(\Magento\SalesRule\Model\RuleFactory $ruleFactory){
        $this->ruleFactory = $ruleFactory;
        error_log('validator constructed');
    }

    public function aroundInit(\Magento\SalesRule\Model\Validator $subject, $procede, $websiteId, $customerGroupId, $couponCode){
        //custom before code
        $return = $proceed($websiteId, $customerGroupId, $couponCode);
        //custom after code
        return $return;
    }
}

но это всегда будет возвращать значение null для $this->ruleFactory.

документ di.xml содержит следующее:

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
    <type name="\Magento\SalesRule\Model\Validator">
        <plugin name="ValidatorPlugin" type="\MAS\CouponAttempt\Model\SalesRule\Validator" sortOrder="1" disabled="false"/>
    </type>
    <type name="\MAS\CouponAttempt\Model\SalesRule\Validator">
        <arguments>
            <argument name="ruleFactoryInjection" xsi:type="object">Magento\SalesRule\Model\RuleFactory</argument>
        </arguments>
    </type>
</config>

Интересно, что я обнаружил, что в сгенерированном файле Interceptor.php действительно создается конструктор.Но его никогда не вызывают, может кто-нибудь сказать мне, почему это может быть?

Это было полезно?

Решение 3

Я решил пойти с менее чистым решением и просто использовал статический экземпляр ObjectManager и получил завод правила через это

Другие советы

Поздний ответ, но вам нужно изменить __constructor к __construct и он будет работать отлично.По возможности не используйте статический ObjectManager.Вместо этого вам всегда следует использовать DI.

Да, это поддерживается.Похоже на ваш образец function ключевое слово отсутствует, попробуйте:

public function __constructor(\Magento\SalesRule\Model\RuleFactory $ruleFactory){
    $this->ruleFactory = $ruleFactory;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с magento.stackexchange
scroll top