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?
źródło
To wydaje się być bezpieczne. Przynajmniej Magento robi to w wielu miejscach. Przykłady metod __construct na poniższej (nie wyłącznej) liście klas
Niestety nie mogę odpowiedzieć na drugą część twojego pytania.
źródło
$mine
jest wymagany parametr, podczas$resource
,$resourceCollection
i$data
są opcjonalne . Parametry opcjonalne powinny zawsze pozostawać na końcu, w przeciwnym razie praca z nimi jest po prostu niemożliwa, jak w przypadku opcji opcjonalnych. Więc wydaje mi się, że powinieneś określić$mine
przed jakimikolwiek parametrami opcjonalnymi.źródło
$mine
na przód kolejki spowoduje błędy. Jeśli kod systemu Magento nie korzysta z nich, to dlaczego one istnieją? Oto pytanie, na które staram się dotrzeć do sedna. To, że mogę używać mojego modelu z przesuniętym parametrem, nie czyni go bezpiecznym.$mine
przed parametrami opcjonalnymi, stają się one naprawdę opcjonalne, a Magento po prostu przekazuje wartości domyślne (null
,array()
). Jeśli umieścisz wymagany parametr po parametrach opcjonalnych, PHP uważa parametry opcjonalne za wymagane i Magento próbował je utworzyć (ale nie ma dla nich preferencji).