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?
quelle
Dies scheint sicher zu sein. Zumindest macht Magento dies an einer Reihe von Orten. Beispiele finden Sie in den __construct-Methoden in der folgenden (nicht exklusiven) Klassenliste
Leider kann ich den anderen Teil Ihrer Frage nicht beantworten.
quelle
$mine
ist ein erforderlicher Parameter, während$resource
,$resourceCollection
und$data
sind optional . Optionale Parameter sollten immer an letzter Stelle stehen, sonst ist es einfach unmöglich, mit ihnen zu arbeiten, wie mit optional. Daher erscheint es mir in Ordnung, dass Sie$mine
vor optionalen Parametern angeben sollten .quelle
$mine
an der Spitze der Warteschlange befinden, werden Fehler erzeugt. Wenn der Magento-Kernsystemcode sie nicht verwendet, warum gibt es sie dann? Das ist die Frage, der ich auf den Grund gehen will. Nur weil ich mein Modell mit verschobenem Parameter verwenden kann, ist es nicht sicher.$mine
vor den optionalen Parametern stehen, werden diese wirklich optional und Magento übergibt nur die Standardwerte (null
,array()
). Wenn Sie einen erforderlichen Parameter nach einem optionalen setzen, betrachtet PHP optionale Parameter als erforderlich und Magento hat versucht, sie zu instanziieren (aber es gibt keine Einstellungen für sie).