Можно ли ввести зависимость в модель 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?