Magento 2: el administrador de objetos intenta crear una instancia de la clase Abstract. ( Error fatal )

37

Jugando con Magento 2 pero me encuentro con un problema que no puedo entender. El administrador de objetos intenta crear una instancia de la clase abstracta, esto da un error fatal. ¿Alguien sabe qué podría causar esto o señalarme en la dirección correcta?

El error

Fatal error: Cannot instantiate abstract class Magento\Framework\Model\Resource\AbstractResource in /lib/internal/Magento/Framework/ObjectManager/Factory/Dynamic/Developer.php on line 75

El problema

Mi módulo tiene un modelo que extiende el \Magento\Quote\Model\Quote. El constructor de este modelo tiene la siguiente línea que inyecta esto:

\Magento\Framework\Model\Resource\AbstractResource $resource = null,.

El controlador que está creando instancias del modelo extiende \Magento\Backend\App\Actiony utiliza $this->_objectManager->create()para crear instancias del modelo.

Lo que no puedo entender es que si ejemplifico el modelo de Magento simplemente funciona, pero si ejemplifico mi modelo, intenta instanciar esta clase abstracta arrojando el error anterior. ¿Qué le dice al administrador de objetos que haga esto y cómo puedo resolver mi problema?

Mi primer pensamiento fue que Magento usa el di.xmlpara reemplazar esto, ejecutar esto o algo así, este no fue el caso.

Gracias por tomarse el tiempo de leer esto. Se agradece cualquier ayuda o aportación sobre este tema.

rofavadeka
fuente
¿Puedes publicar tu código en la pregunta?
Marius
¿Podrías ser un poco más específico? Toda la clase de controlador y el modelo instanciado son enormes y agregarlos a la pregunta no hace que sea más fácil comprender el problema inicial. ¿Funcionará la acción o el constructor?
rofavadeka
Lo suficientemente justo. Publique el nombre de su clase, lo que extiende, lo que implementa y el __constructmétodo de su modelo.
Marius
Según lo solicitado :) la parte superior del modelo. Creo que Chris tiene la solución, probaré esto y nos pondremos en contacto contigo. Gracias marius
rofavadeka
Sí. Creo que Chris lo entendió. :)
Marius

Respuestas:

109

Esto puede suceder si su subclase agregó nuevas dependencias después de las dependencias opcionales existentes de la clase principal.

Fragmento del padre

    \Magento\Quote\Model\Cart\CurrencyFactory $currencyFactory,  // required
    JoinProcessorInterface $extensionAttributesJoinProcessor,    // required
    \Magento\Framework\Model\Resource\AbstractResource $resource = null,       //optional
    \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null,  //optional
    array $data = [] //optional
)}

Cómo el código puede alterar lo que es opcional

    \Magento\Quote\Model\Cart\CurrencyFactory $currencyFactory,  // required
    JoinProcessorInterface $extensionAttributesJoinProcessor,    // required
    \Magento\Framework\Model\Resource\AbstractResource $resource = null,       // required (even though it has a default value, because it is followed by parameters that don't have default values)
    int $x, // required
    \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null,  // optional (still optional because there are no required parameters following it)
    array $data = [] // optional
)}

El Administrador de objetos de Magento 2 intentará inyectar los parámetros necesarios. Entonces esto podría suceder si agrega un parámetro requerido al final del constructor.

Puede solucionar esto moviendo cualquier nuevo parámetro requerido por encima de los opcionales.

Chris O'Toole
fuente
1
Chris, te has ganado un enorme ¡Gracias! Resolviste mi problema a lo grande.
rofavadeka
Y un segundo MUCHAS GRACIAS. Te amo hermano
Yonn Trimoreau
La solución @Chris proporcionada por usted me ayudó, gracias
Mukesh
Gran explicación!
Henry Bui
Mi problema fue que cuando usé el autocompletado en phpStorm, también falló en traer la parte nula: /
OZZIE
0

Algunas veces se actualizó algún módulo y las referencias bajo / generadas aún no se actualizaron.

Solo haz un bin/magento setup:di:compilee intenta de nuevo.

(Me funcionó al actualizar un módulo de pago y / el proceso de pago no se cargó)

Ricardo Martins
fuente