Magento 2 - Menedżer obiektów próbuje utworzyć instancję klasy Abstract. ( Błąd krytyczny )


37

Bawię się Magento 2, ale napotykam problem, którego nie mogę zawinąć. Menedżer obiektów próbuje utworzyć instancję klasy Abstract, co powoduje błąd krytyczny. Czy ktoś wie, co może to spowodować lub skierować mnie w dobrym kierunku?

Błąd

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

Problem

Mój moduł ma model, który rozszerza \Magento\Quote\Model\Quote. Konstruktor tego modelu ma następującą linię:

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

Kontroler, który tworzy instancję modelu, rozszerza \Magento\Backend\App\Actioni używa $this->_objectManager->create()do tworzenia instancji modelu.

Rzeczą, której nie mogę owinąć wokół głowy, jest to, że jeśli utworzę instancję modelu Magento, to po prostu działa, ale jeśli utworzę instancję mojego modelu, spróbuje utworzyć instancję tej abstrakcyjnej klasy, zgłaszając błąd powyżej. Co mówi menedżerowi obiektów, aby to zrobił i jak mogę rozwiązać mój problem?

Moją pierwszą myślą było to, że Magento używa tego di.xmldo zastąpienia tego, wykonania tego czy czegoś, to nie było tak.

Dzięki za poświęcenie czasu na przeczytanie tego. Każda pomoc lub wkład w tę kwestię jest mile widziany.


czy możesz opublikować swój kod w pytaniu?
Marius

Czy mógłbyś być bardziej szczegółowy? Cała klasa kontrolera i model instancji są ogromne, a dodanie ich do pytania nie ułatwia zrozumienia początkowego problemu. Czy wystarczy działanie akcji lub konstruktor?
rofavadeka

Słusznie. Zamieść nazwę swojej klasy, co ona rozszerza, co implementuje i __constructmetodę twojego modelu.
Marius

Zgodnie z życzeniem :) górna część modelu. Myślę, że Chris ma rozwiązanie, przetestuje to i wróci do ciebie. Dzięki Marius.
rofavadeka

Tak. Myślę, że Chris to zrozumiał. :)
Marius

Odpowiedzi:


109

Może się to zdarzyć, jeśli podklasa dodała nowe zależności po istniejących opcjonalnych zależnościach klasy nadrzędnej.

Urywek od rodzica

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

Jak kod może zmienić to, co opcjonalne

    \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 spróbuje wprowadzić wszystkie wymagane parametry. Może się tak zdarzyć, jeśli dodasz wymagany parametr na końcu konstruktora.

Możesz to naprawić, przesuwając dowolny nowy wymagany parametr powyżej opcjonalnych.


1
Chris, zasłużyłeś na wielkie podziękowania! Dużo czasu rozwiązałeś mój problem.
rofavadeka

I drugi DUŻY DZIĘKUJĘ. Kocham cię bracie
Yonn Trimoreau

@Chris dostarczone przez Ciebie rozwiązanie pomogło mi, dzięki
Mukesh

Świetne wyjaśnienie!
Henry Bui

Mój problem polegał na tym, że podczas korzystania z autouzupełniania w phpStorm nie udało się również wprowadzić części = null: /
OZZIE

0

Czasami niektóre moduły były aktualizowane, a odniesienia w / generowane nie były jeszcze aktualizowane.

Po prostu zrób bin/magento setup:di:compilei spróbuj ponownie.

(Pracowało dla mnie podczas aktualizacji modułu płatności i / zamówienie nie zostało załadowane)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.