Можно ли ввести зависимость в модель CRUD Magento 2?
То есть - Magento 2 имеет базовый абстрактный класс модели: Magento\Framework\Model\AbstractModel
. Если вы хотите создать простой объект модели Create, Read, Update, Delete, вы расширяете этот класс своим собственным классом.
class Foo extends Magento\Framework\Model\AbstractModel
{
}
Возможно ли внедрить зависимости в __construct
метод вашей модели ? Когда я пытаюсь, я получаю следующую ошибку.
Неустранимая ошибка: невозможно создать экземпляр абстрактного класса Magento \ Framework \ Model \ ResourceModel \ AbstractResource
Преступник , кажется, AbstractModel
«S __construct
метод.
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 = []
) {
Есть два типа подсказки в этом конструкторе ( Magento\Framework\Model\ResourceModel\AbstractResource
, Magento\Framework\Data\Collection\AbstractDb
), которые не Magento менеджер объекта интерфейсы. Это абстрактные классы. Когда я расширяю этот класс и пытаюсь добавить свою введенную зависимость
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 запускается, когда менеджер объектов пытается создать экземпляр абстрактных классов.
Я могу «исправить» это, переместив мою объектную зависимость перед абстрактными классами
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 = [],
) {
Однако это изменило порядок аргументов. В классе, который полностью управляется объектами, это не будет проблемой. Однако тот факт, что эти абстрактные подсказки типов классов существуют, подразумевает, что есть части системы Magento, которые будут вручную (т.е. не через диспетчер объектов или DI) создавать экземпляры объектов CRUD и передавать объекты, которые соответствуют подсказкам типов в этом конкретном порядке .
Это безопасно? т.е. являются ли эти абстрактные классы в конструкторе абстрактной модели просто устаревшим кодом и не используются? Или части системы все еще будут использовать их, что означает, что невозможно внедрить зависимости в модель CRUD?
источник
Это кажется безопасным. По крайней мере, Мадженто делает это во многих местах. Смотрите примеры методов __construct в следующем (неисключительном) списке классов.
К сожалению, я не могу ответить на другую часть вашего вопроса.
источник
$mine
это требуется параметр, в то время$resource
,$resourceCollection
и$data
являются по желанию . Необязательные параметры всегда должны быть последними, иначе с ними просто невозможно работать, как с необязательными. Так что мне кажется, что вы должны указать$mine
любые необязательные параметры.источник
$mine
в начало очереди приведет к ошибкам. Если системный код Magento не использует их, то почему они там? Вот вопрос, который я пытаюсь понять до конца. То, что я могу использовать свою модель с перемещенным параметром, не делает ее безопасной.$mine
перед необязательными параметрами, они становятся действительно необязательными, и Magento просто передает значения по умолчанию (null
,array()
). Если вы ставите обязательный параметр после необязательных, PHP рассматривает необязательные параметры как обязательные, и Magento пытается их создать (но для них нет предпочтений).