Ist Abhängigkeitsinjektion für Plugins möglich?
-
13-12-2019 - |
Frage
Ich versuche ein Plugin zu erstellen, um den \ Magento \ SalesRule \ Model \ Validator zu erweitern
Das funktioniert wie ein Zauber, aber das Problem ist, dass ich Magento \ SalesRule \ Model \ RuleFactory verwenden muss
Ich habe versucht, einen __Konstruktor in der Plugin-Klasse zu erstellen und dort die Regelfabrik durch Abhängigkeitsinjektion hinzuzufügen, wie im Magento 2-Entwicklerhandbuch beschrieben, das so aussah:
Die gesamte Plugin-Klasse "Validator" sieht jetzt so aus:
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;
}
}
dies würde jedoch immer nur null für $this->ruleFactory zurückgeben.
die di.xml-Dokument enthält Folgendes:
<?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>
Interessanterweise habe ich das im generierten Interceptor gefunden.php-Datei, in der der Konstruktor tatsächlich erstellt wurde.Aber es wird nie angerufen, kann mir jemand sagen, warum das so sein könnte?
Lösung 3
Ich beschloss, mit der weniger sauberen Lösung zu gehen, und verwendete gerade eine statische Instanz des Objektmanagers und erhielt die Regelfabrik durch das
Andere Tipps
Verspätete Antwort, aber Sie müssen den generationspflichtigen Code in den __constructor
ändern, und es funktioniert perfekt gut.Verwenden Sie nicht statischer ObjektManager, wenn möglich.Sie sollten stattdessen dI immer verwenden.
Ja, es wird unterstützt.Sieht aus wie in Ihrer Probe function
schlüsselwort fehlt, versuchen Sie es:
public function __constructor(\Magento\SalesRule\Model\RuleFactory $ruleFactory){
$this->ruleFactory = $ruleFactory;
}