Magento 2 - Le gestionnaire d'objets essaie d'instancier la classe abstraite. ( Erreur fatale )

37

Jouer avec Magento 2 mais rencontrer un problème, je ne peux pas envelopper ma tête. Le gestionnaire d'objets tente d'instancier la classe abstraite, ce qui donne une erreur fatale. Est-ce que quelqu'un sait ce qui pourrait causer ceci ou me diriger dans la bonne direction?

L'erreur

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

Le problème

Mon module a un modèle qui étend le \Magento\Quote\Model\Quote. Le constructeur de ce modèle a la ligne suivante injectant ceci:

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

Le contrôleur qui instancie le modèle étend le \Magento\Backend\App\Actionet utilise $this->_objectManager->create()pour instancier le modèle.

Ce que je ne peux pas comprendre, c'est que si j'instancie le modèle Magento, cela fonctionne, mais si j'instancie mon modèle, il tente d'instancier cette classe abstraite en lançant l'erreur ci-dessus. Qu'est-ce qui dit au gestionnaire d'objets de faire cela et comment puis-je résoudre mon problème?

Ma première pensée a été que Magento utilise le di.xmlpour remplacer ceci, exécuter ceci ou quelque chose, ce n'était pas le cas.

Merci d'avoir pris le temps de lire ceci. Toute aide ou contribution sur cette question est appréciée.

Rofavadeka
la source
pouvez-vous poster votre code dans la question?
Marius
Pourriez-vous être un peu plus précis? Toute la classe de contrôleurs et le modèle instancié sont énormes et leur ajout à la question ne facilite pas la compréhension du problème initial. L'action ou le constructeur suffiront-ils?
rofavadeka
C'est suffisant. Postez votre nom de classe, ce qu’il étend, ce qu’il implémente et la __constructméthode de votre modèle.
Marius
Comme demandé :) la partie supérieure du modèle. Je pense que Chris a la solution, il va tester cela et vous recontacter. Merci Marius.
rofavadeka
Oui. Je pense que Chris l'a eu. :)
Marius

Réponses:

109

Cela peut arriver si votre sous-classe a ajouté de nouvelles dépendances après les dépendances facultatives existantes de la classe parente.

Extrait du parent

    \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
)}

Comment le code peut modifier ce qui est optionnel

    \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
)}

Le gestionnaire d’objets de Magento 2 essaiera d’injecter les paramètres requis. Cela peut donc arriver si vous avez ajouté un paramètre requis à la fin du constructeur.

Vous pouvez résoudre ce problème en déplaçant tout nouveau paramètre requis au-dessus des paramètres facultatifs.

Chris O'Toole
la source
1
Chris, tu as mérité un énorme merci! Vous avez résolu mon problème beaucoup de temps.
rofavadeka
Et un deuxième MERCI. Je t'aime mon frère
Yonn Trimoreau
La solution @Chris fournie par vous m'a aidé, merci
Mukesh
Grande explication!
Henry Bui
Mon problème était que, lorsque vous utilisez l'auto-complét dans phpStorm, il n'a pas réussi à apporter également avec la partie = null: /
OZZIE
0

Parfois, certains modules étaient mis à jour et les références sous / générées n'étaient pas encore mises à jour.

Il suffit de faire un bin/magento setup:di:compileet essayez à nouveau.

(Travaillé pour moi lors de la mise à jour d'un module de paiement et / checkout ne s'est pas chargé)

Ricardo Martins
la source