Magento 2 - Der Objektmanager versucht, eine abstrakte Klasse zu instanziieren. ( Fataler Fehler )

37

Wenn ich mit Magento 2 herumspiele, aber auf ein Problem stoße, kann ich meinen Kopf nicht umwickeln. Der Objektmanager versucht, die Klasse Abstract zu instanziieren. Dies führt zu einem schwerwiegenden Fehler. Weiß jemand, woran das liegen könnte oder weist er mich in die richtige Richtung?

Der Fehler

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

Das Problem

Mein Modul hat ein Modell, das die \Magento\Quote\Model\Quote. Der Konstruktor dieses Modells hat die folgende Zeile, die dies einfügt:

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

Der Controller, der das Modell instanziiert, erweitert \Magento\Backend\App\Actionund verwendet $this->_objectManager->create(), um das Modell zu instanziieren.

Wenn ich das Magento-Modell instanziiere, funktioniert es nur, aber wenn ich mein Modell instanziiere, versucht es, diese abstrakte Klasse zu instanziieren, die den obigen Fehler auslöst. Was sagt der Objektmanager dazu und wie kann ich mein Problem lösen?

Mein erster Gedanke war, dass Magento das verwendet di.xml, um dies zu ersetzen, dies auszuführen oder so, das war nicht der Fall.

Vielen Dank, dass Sie sich die Zeit genommen haben, dies zu lesen. Jede Hilfe oder Anregung zu diesem Thema wird gebeten.

Rofavadeka
quelle
Kannst du deinen Code in der Frage posten?
Marius
Könnten Sie vielleicht etwas genauer sein? Die gesamte Controllerklasse und das instanziierte Modell sind riesig und das Hinzufügen zu der Frage macht es nicht einfacher, das ursprüngliche Problem zu verstehen. Wird die Aktionsfunktion oder der Konstruktor ausreichen?
Rofavadeka
Meinetwegen. Veröffentlichen Sie Ihren Klassennamen, was er erweitert, was er implementiert und die __constructMethode Ihres Modells.
Marius
Wie gewünscht :) das Oberteil des Modells. Ich denke, Chris hat die Lösung, er wird das testen und sich bei Ihnen melden. Vielen Dank, Marius.
Rofavadeka
Ja. Ich denke, Chris hat es verstanden. :)
Marius

Antworten:

109

Dies kann passieren, wenn Ihre Unterklasse neue Abhängigkeiten nach den vorhandenen optionalen Abhängigkeiten der übergeordneten Klasse hinzugefügt hat.

Ausschnitt vom Elternteil

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

Wie der Code ändern könnte, was optional ist

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

Der Magento 2 Object Manager versucht, alle erforderlichen Parameter einzufügen. Dies könnte also passieren, wenn Sie am Ende des Konstruktors einen erforderlichen Parameter hinzufügen.

Sie können dies beheben, indem Sie einen neuen erforderlichen Parameter über die optionalen Parameter stellen.

Chris O'Toole
quelle
1
Chris, du hast dir ein riesiges Dankeschön verdient! Du hast mein Problem gelöst, große Zeit.
rofavadeka
Und ein zweites großes Dankeschön. Ich liebe dich Bruder
Yonn Trimoreau
@ Chris Lösung von Ihnen hat mir geholfen, danke
Mukesh
Tolle Erklärung!
Henry Bui
Mein Problem war, dass es bei Verwendung von Auto-Vervollständigung in phpStorm nicht gelang, auch den Teil = null
mitzubringen
0

Manchmal wurde ein Modul aktualisiert und die Referenzen unter / generated wurden noch nicht aktualisiert.

Mach einfach einen bin/magento setup:di:compileund versuche es erneut.

(Hat bei mir funktioniert, als ein Zahlungsmodul aktualisiert und / oder die Kasse nicht geladen wurde.)

Ricardo Martins
quelle