Czy możliwe jest wstrzyknięcie zależności do modelu CRUD Magento 2?
To jest - Magento 2 ma bazową klasę abstrakcyjną modelu Magento\Framework\Model\AbstractModel
. Jeśli chcesz utworzyć prosty obiekt do tworzenia, odczytu, aktualizacji, usuwania modelu, rozszerz tę klasę o własną klasę.
class Foo extends Magento\Framework\Model\AbstractModel
{
}
Czy możliwe jest wstrzyknięcie zależności do __construct
metody twojego modelu ? Kiedy próbuję, pojawia się następujący błąd.
Błąd krytyczny: nie można utworzyć instancji klasy abstrakcyjnej Magento \ Framework \ Model \ ResourceModel \ AbstractResource
Winowajcą wydaje się być AbstractModel
„s __construct
metoda.
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 = []
) {
W tym konstruktorze ( Magento\Framework\Model\ResourceModel\AbstractResource
, Magento\Framework\Data\Collection\AbstractDb
) istnieją dwie wskazówki dotyczące typów , które nie są interfejsami menedżera obiektów Magento. To są abstrakcyjne klasy. Kiedy rozszerzam tę klasę i próbuję dodać moją wstrzykiwaną zależność
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 bailuje, gdy menedżer obiektów próbuje utworzyć instancję klas abstrakcyjnych.
Mogę to naprawić, przenosząc moją zależność od obiektów przed klasy abstrakcyjne
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 = [],
) {
Zmieniło to jednak kolejność argumentów. W klasie w pełni zarządzanej obiektowo nie byłoby problemu. Jednak fakt, że istnieją te abstrakcyjne wskazówki dotyczące klas, oznacza, że istnieją części systemu Magento, które ręcznie (tj. Nie za pośrednictwem menedżera obiektów lub DI) utworzą obiekty CRUD i przekażą obiekty zgodne z podpowiedziami typu w tej określonej kolejności .
Czy to jest bezpieczne? tj. Czy te abstrakcyjne klasy w konstruktorze abstrakcyjnego modelu są tylko starszym kodem i nie są używane? Czy też części systemu nadal będą z nich korzystać, co oznacza, że nie można wstrzykiwać zależności do modelu CRUD?