Question

J'essaie de créer un plugin pour étendre le \Magento\SalesRule\Model\Validator

Ce qui fonctionne à merveille, mais le problème est que je dois utiliser Magento\SalesRule\Model uleFactory

J'ai essayé de créer un __constructor dans la classe du plugin et d'y ajouter RuleFactory via l'injection de dépendances comme décrit dans le guide du développeur Magento 2 qui ressemblait à ceci :

La classe entière du plugin « Validator » ressemble désormais à ceci :

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;
    }
}

mais cela renverrait simplement null pour $this->ruleFactory à tout moment.

le document di.xml contient les éléments suivants :

<?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>

Chose intéressante, j'ai découvert que dans le fichier Interceptor.php généré, le constructeur est réellement créé.Mais on ne l'appelle jamais, quelqu'un peut-il me dire pourquoi ?

Était-ce utile?

La solution 3

J'ai décidé d'aller avec la solution moins propre et j'ai simplement utilisé une instance statique de l'objetManager et obtenu l'usine de règle à travers celle

Autres conseils

Réponse tardive mais vous devez changer __constructor à __construct et cela fonctionnera parfaitement bien.N'utilisez pas ObjectManager statique si possible.Vous devriez toujours utiliser DI à la place.

Oui, il est pris en charge. On dirait que vous manquez dans votre échantillon function. Essayez:

public function __constructor(\Magento\SalesRule\Model\RuleFactory $ruleFactory){
    $this->ruleFactory = $ruleFactory;
}

Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top