È possibile iniezione di dipendenza per i plugin?
-
13-12-2019 - |
Domanda
Sto cercando di creare un plug-in per estendere il \ magento \ salestrule \ modello \ validator
Che funziona come un fascino, ma il problema è necessario utilizzare Magento \ Salestrufo \ Model \ Rulefactory
Ho provato a fare un __constructor nella classe Plugin e aggiungendo la Rulefactory attraverso l'iniezione di dipendenza come descritto nella Guida agli sviluppatori Het Magento 2 che sembrava questo:
L'intera classe Plugin "validator" è ora simile a questo:
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;
}
}
.
Ma questo restituirebbe solo NULL per $-> Rulefactory in ogni momento.
Il documento DI.XML contiene quanto segue:
<?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>
.
Abbastanza interessante di aver trovato che nel file interceptor.php generato il costruttore è effettivamente fatto.Ma non è mai chiamato, qualcuno può dirmi perché questo potrebbe essere?
Soluzione 3
Ho deciso di andare con la soluzione meno pulita e ho appena usato un'istanza statica dell'oggettoManager e ha ottenuto la fabbrica di regole attraverso quella
Altri suggerimenti
Risposta tardiva Ma è necessario modificare __constructor
in __construct
e funzionerà perfettamente bene.Non utilizzare l'oggetto statico, se possibile.Dovresti sempre usare DI invece.
Sì, è supportato.
Sembra che sia nella tua chiave function
, prova:
public function __constructor(\Magento\SalesRule\Model\RuleFactory $ruleFactory){
$this->ruleFactory = $ruleFactory;
}
.