Ist es möglich, eine Abhängigkeit in ein Magento 2 CRUD-Modell zu injizieren?
Das ist - Magento 2 hat eine Basis abstrakte Modellklasse: Magento\Framework\Model\AbstractModel
. Wenn Sie ein einfaches Modellobjekt erstellen, lesen, aktualisieren, löschen möchten, erweitern Sie diese Klasse mit Ihrer eigenen Klasse.
class Foo extends Magento\Framework\Model\AbstractModel
{
}
Ist es möglich, Abhängigkeiten in die __construct
Methode Ihres Modells einzufügen? Wenn ich es versuche, erhalte ich den folgenden Fehler.
Schwerwiegender Fehler: Abstrakte Klasse Magento \ Framework \ Model \ ResourceModel \ AbstractResource kann nicht instanziiert werden
Der Täter scheint der zu sein , AbstractModel
‚s - __construct
Methode.
public function __construct(
\Magento\Framework\Model\Context $context,
\Magento\Framework\Registry $registry,
\Magento\Framework\Model\ResourceModel\AbstractResource $resource = null,
\Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null,
array $data = []
) {
In diesem Konstruktor ( Magento\Framework\Model\ResourceModel\AbstractResource
, Magento\Framework\Data\Collection\AbstractDb
) gibt es zwei Typhinweise , die keine Magento-Objektmanager-Schnittstellen sind. Sie sind abstrakte Klassen. Wenn ich diese Klasse erweitere und versuche, meine injizierte Abhängigkeit hinzuzufügen
class Foo extends Magento\Framework\Model\AbstractModel
{
public function __construct(
\Magento\Framework\Model\Context $context,
\Magento\Framework\Registry $registry,
\Magento\Framework\Model\ResourceModel\AbstractResource $resource = null,
\Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null,
array $data = [],
\Package\Module\Model\Mine $mine,
) {
//...
parent::__construct($context, $registry, $resource, $resourceCollection, $data);
}
}
Magento wird beendet, wenn der Objektmanager versucht, die abstrakten Klassen zu instanziieren.
Ich kann dies "beheben", indem ich meine Objektabhängigkeit vor die abstrakten Klassen stelle
public function __construct(
\Magento\Framework\Model\Context $context,
\Magento\Framework\Registry $registry,
\Package\Module\Model\Mine $mine,
\Magento\Framework\Model\ResourceModel\AbstractResource $resource = null,
\Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null,
array $data = [],
) {
Dies änderte jedoch die Argumentreihenfolge. In einer Klasse, die vollständig von Objekten verwaltet wurde, wäre dies kein Problem. Die Tatsache, dass diese abstrakten Klassentyphinweise vorhanden sind, impliziert jedoch, dass es Teile des Magento-Systems gibt, die CRUD-Objekte manuell (dh nicht über den Objektmanager oder DI) instanziieren und Objekte übergeben, die den Typhinweisen in dieser bestimmten Reihenfolge entsprechen .
Ist das sicher? Sind diese abstrakten Klassen im Konstruktor eines abstrakten Modells nur Legacy-Code und werden sie nicht verwendet? Oder werden Teile des Systems diese weiterhin verwenden, was bedeutet, dass es nicht möglich ist, Abhängigkeiten in ein CRUD-Modell einzufügen?