Pregunta

Estoy intentando crear un complemento para extender \Magento\SalesRule\Model\Validator

Lo cual funciona de maravilla, pero el problema es que necesito hacer uso de Magento\SalesRule\Model uleFactory

Intenté crear un __constructor en la clase de complemento y agregar RuleFactory allí mediante la inyección de dependencia como se describe en la Guía para desarrolladores de Magento 2, que se veía así:

Toda la clase del complemento "Validador" ahora se ve así:

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

pero esto simplemente devolvería null para $this->ruleFactory en todo momento.

el documento di.xml contiene lo siguiente:

<?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 descubrí que en el archivo Interceptor.php generado el constructor realmente está creado.Pero nunca se llama, ¿alguien puede decirme por qué podría ser esto?

¿Fue útil?

Solución 3

Decidí ir con la solución menos limpia y acaba de usar una instancia estática del ObjectManager y obtuve la fábrica de reglas a través de ese

Otros consejos

Respuesta tardía pero necesitas cambiar. __constructor a __construct y funcionará perfectamente.No utilice ObjectManager estático si es posible.Siempre debes usar DI en su lugar.

Sí, es compatible.Parece en tu muestra function Falta la palabra clave, intente:

public function __constructor(\Magento\SalesRule\Model\RuleFactory $ruleFactory){
    $this->ruleFactory = $ruleFactory;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a magento.stackexchange
scroll top