Pergunta

Estou tentando fazer um plugin para estender o \Magento\SalesRule\Model\Validator

O que funciona perfeitamente, mas o problema é que preciso usar Magento\SalesRule\Model uleFactory

Eu tentei fazer um __constructor na classe do plugin e adicionar o RuleFactory lá por meio de injeção de dependência, conforme descrito no Guia do desenvolvedor do Magento 2, que se parecia com isto:

Toda a classe do plugin "Validator" agora se parece com isto:

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

mas isso retornaria null para $this->ruleFactory o tempo todo.

o documento di.xml contém o seguinte:

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

Curiosamente, descobri que no arquivo Interceptor.php gerado o construtor é realmente feito.Mas nunca é chamado, alguém pode me dizer por que isso acontece?

Foi útil?

Solução 3

Decidi optar pela solução menos limpa e apenas usei uma instância estática do gerenciador de objetos e obtive a fábrica de regras por meio disso

Outras dicas

Resposta tardia, mas você precisa mudar __constructor para __construct e funcionará perfeitamente bem.Não use ObjectManager estático, se possível.Você deve sempre usar DI.

Sim, é suportado.Parece que na sua amostra function palavra-chave está faltando, tente:

public function __constructor(\Magento\SalesRule\Model\RuleFactory $ruleFactory){
    $this->ruleFactory = $ruleFactory;
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a magento.stackexchange
scroll top