Magento 2: el administrador de objetos intenta crear una instancia de la clase abstracta.( Error fatal )
-
13-12-2019 - |
Pregunta
Estoy 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, lo que genera un error fatal.¿Alguien sabe qué podría causar esto o indicarme 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 inyectando esto:
\Magento\Framework\Model\Resource\AbstractResource $resource = null,
.
El controlador que está creando una instancia del modelo extiende el \Magento\Backend\App\Action
y usos $this->_objectManager->create()
para instanciar el modelo.
Lo que no puedo entender es que si creo una instancia del modelo Magento, simplemente funciona, pero si creo una instancia de mi modelo, intenta crear una instancia de esta clase abstracta arrojando el error anterior.¿Qué le dice al administrador de objetos que haga esto y cómo puedo resolver mi problema?
Lo primero que pensé fue que Magento usa el di.xml
para 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.
Solución
Esto puede suceder si su subclase agregó nuevas dependencias después de las dependencias opcionales existentes de la clase principal.
Fragmento de los padres
\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 podría 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 agregas un parámetro requerido al final del constructor.
Puede solucionar este problema moviendo cualquier nuevo parámetro requerido por encima de los opcionales.
Otros consejos
A veces se actualizó algún módulo y las referencias en /generado aún no se actualizaron.
solo haz un bin/magento setup:di:compile
e intenta de nuevo.
(Me funcionó al actualizar un módulo de pago y /checkout no se cargó)