Est-il possible d'injecter une dépendance dans un modèle Magento 2 CRUD?
C'est - Magento 2 a une classe de modèle abstrait de base: Magento\Framework\Model\AbstractModel
. Si vous souhaitez créer un simple objet Créer, lire, mettre à jour, supprimer un modèle, vous étendez cette classe avec votre propre classe.
class Foo extends Magento\Framework\Model\AbstractModel
{
}
Est-il possible d'avoir injecté des dépendances dans la __construct
méthode de votre modèle ? Quand j'essaye, je finis par obtenir l'erreur suivante.
Erreur fatale: impossible d'instancier la classe abstraite Magento \ Framework \ Model \ ResourceModel \ AbstractResource
Le coupable semble être la AbstractModel
de » __construct
méthode.
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 = []
) {
Il existe deux types d'indices dans ce constructeur ( Magento\Framework\Model\ResourceModel\AbstractResource
, Magento\Framework\Data\Collection\AbstractDb
) qui ne sont pas des interfaces du gestionnaire d'objets Magento. Ce sont des classes abstraites. Quand j'étends cette classe et essaie d'ajouter ma dépendance injectée
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 échoue lorsque le gestionnaire d'objets essaie d'instancier les classes abstraites.
Je peux "corriger" cela en déplaçant ma dépendance d'objet devant les classes abstraites
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 = [],
) {
Cependant, cela a changé l'ordre des arguments. Dans une classe entièrement gérée par des objets, ce ne serait pas un problème. Cependant, le fait que ces indications de type de classe abstraite impliquent qu'il existe des parties du système Magento qui vont manuellement (c'est-à-dire pas via le gestionnaire d'objets ou DI) instancier des objets CRUD et transmettre des objets qui sont conformes aux indications de type dans cet ordre spécifique .
Est-ce sûr? ie Ces classes abstraites dans le constructeur d'un modèle abstrait ne sont-elles que du code hérité et ne sont-elles pas utilisées? Ou certaines parties du système les utiliseront-elles encore, ce qui signifie qu'il n'est pas possible d'injecter des dépendances dans un modèle CRUD?
la source
Cela semble sûr. Au moins, magento fait cela à plusieurs endroits. Voir les méthodes __construct dans la liste de classes (non exclusive) suivante pour des exemples
Malheureusement, je ne peux pas répondre à l'autre partie de votre question.
la source
$mine
un paramètre est requis , tandis que$resource
,$resourceCollection
et$data
sont facultatifs . Les paramètres facultatifs devraient toujours durer, sinon il est tout simplement impossible de travailler avec eux comme avec facultatif. Il me semble donc que vous devez spécifier$mine
avant tout paramètre facultatif.la source
$mine
vers le début de la file d'attente, cela créera des erreurs. Si le code du système de base Magento ne les utilise pas, pourquoi sont-ils là? C'est la question que j'essaie de comprendre. Ce n'est pas parce que je suis capable d'utiliser mon modèle avec le paramètre déplacé que cela est sûr.$mine
avant les paramètres facultatifs, ils deviennent vraiment facultatifs et Magento passe juste les valeurs par défaut (null
,array()
). Si vous placez un paramètre obligatoire après les paramètres facultatifs, PHP considère les paramètres facultatifs comme des paramètres obligatoires et Magento a essayé de les instancier (mais il n'y a aucune préférence pour eux).