Magento 2 - Il gestore oggetti tenta di creare un'istanza della classe Abstract. ( Errore fatale )


37

Giocando con Magento 2 ma riscontro un problema, non riesco a farcela. Il gestore oggetti tenta di creare un'istanza della classe Abstract, ciò dà un errore irreversibile. Qualcuno sa cosa potrebbe causare questo o indicarmi la giusta direzione?

L'errore

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

Il problema

Il mio modulo ha un modello che estende il \Magento\Quote\Model\Quote. Il costruttore di questo modello ha la seguente riga iniettando questo:

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

Il controller che sta istanziando il modello estende \Magento\Backend\App\Actione utilizza $this->_objectManager->create()per creare un'istanza del modello.

La cosa che non riesco a avvolgere la testa è che se ho un'istanza del modello Magento funziona, ma se ho un'istanza del mio modello prova a creare un'istanza di questa classe astratta lanciando l'errore sopra. Cosa dice al gestore oggetti di fare questo e come posso risolvere il mio problema?

Il mio primo pensiero è stato che Magento usa il di.xmlper sostituire questo, eseguire questo o qualcosa del genere, non era così.

Grazie per aver dedicato del tempo a leggere questo. Qualsiasi aiuto o input su questo problema è apprezzato.


puoi pubblicare il tuo codice nella domanda?
Marius

Potresti forse essere un po 'più specifico? L'intera classe di controller e il modello istanziato sono enormi e aggiungerli alla domanda non semplifica la comprensione del problema iniziale. Sarà sufficiente l'azione o il costruttore?
rofavadeka,

Giusto. Pubblica il nome della tua classe, cosa si estende, cosa implementa e il __constructmetodo del tuo modello.
Marius

Come richiesto :) la parte superiore del modello. Penso che Chris abbia la soluzione, andando a testare questo e tornare da te. Grazie Marius.
rofavadeka,

Sì. Penso che Chris l'abbia capito. :)
Marius

Risposte:


109

Ciò può accadere se la sottoclasse ha aggiunto nuove dipendenze dopo le dipendenze opzionali esistenti della classe genitore.

Snippet dal genitore

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

Come il codice potrebbe modificare ciò che è facoltativo

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

Magento 2 Object Manager tenterà di iniettare tutti i parametri richiesti. Quindi questo potrebbe accadere se si aggiungesse un parametro richiesto alla fine del costruttore.

È possibile risolvere questo problema spostando qualsiasi nuovo parametro richiesto sopra quelli opzionali.


1
Chris, ti sei guadagnato un enorme grazie! Hai risolto il mio problema alla grande.
rofavadeka,

E un secondo GRANDE GRAZIE. Ti amo fratello
Yonn Trimoreau

La soluzione @Chris da te fornita mi ha aiutato, grazie
Mukesh,

Grande spiegazione!
Henry Bui,

Il mio problema era che quando si utilizzava il completamento automatico in phpStorm non è riuscito a portare anche con la parte = null: /
OZZIE

0

A volte alcuni moduli sono stati aggiornati e i riferimenti sotto / generati non sono stati ancora aggiornati.

Basta fare un bin/magento setup:di:compilee riprovare.

(Ha funzionato per me durante l'aggiornamento di un modulo di pagamento e / checkout non caricato)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.