È possibile iniettare una dipendenza in un modello CRUD Magento 2?
Questo è - Magento 2 ha una base di classe del modello astratto: Magento\Framework\Model\AbstractModel
. Se si desidera creare un semplice oggetto modello Crea, Leggi, Aggiorna, Elimina, si estende questa classe con la propria classe.
class Foo extends Magento\Framework\Model\AbstractModel
{
}
È possibile avere delle dipendenze iniettate nel __construct
metodo del modello ? Quando provo, finisco per ricevere il seguente errore.
Errore irreversibile: impossibile creare un'istanza della classe astratta Magento \ Framework \ Model \ ResourceModel \ AbstractResource
Il colpevole sembra essere il AbstractModel
's __construct
metodo.
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 = []
) {
Esistono due suggerimenti per il tipo in questo costruttore ( Magento\Framework\Model\ResourceModel\AbstractResource
, Magento\Framework\Data\Collection\AbstractDb
) che non sono interfacce di gestione oggetti Magento. Sono lezioni astratte. Quando estendo questa classe e provo ad aggiungere la mia dipendenza iniettata
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 viene rilasciato quando il gestore oggetti tenta di creare un'istanza delle classi astratte.
Posso "risolvere" questo spostando la mia dipendenza dagli oggetti di fronte alle classi astratte
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 = [],
) {
Tuttavia, questo ha cambiato l'ordine degli argomenti. In una classe completamente gestita da oggetti, questo non sarebbe un problema. Tuttavia, il fatto che esistano questi suggerimenti di tipo di classe astratta implica che ci sono parti del sistema Magento che istanzeranno manualmente (cioè non tramite il gestore oggetti o DI) un'istanza di oggetti CRUD e passeranno oggetti conformi ai suggerimenti di tipo in quell'ordine specifico .
È sicuro? vale a dire queste classi astratte nel costruttore di un modello astratto sono solo codice legacy e non vengono utilizzate? O parti del sistema useranno ancora queste, il che significa che non è possibile iniettare dipendenze in un modello CRUD?