Возможно ли внедрение зависимостей для плагинов?
-
13-12-2019 - |
Вопрос
Я пытаюсь создать плагин для расширения \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;
}