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?