是否可以将依赖项注入到Magento 2 CRUD模型中?
也就是说-Magento 2有一个基本的抽象模型类:Magento\Framework\Model\AbstractModel
。如果要创建简单的“创建,读取,更新,删除”模型对象,则可以使用自己的类来扩展该类。
class Foo extends Magento\Framework\Model\AbstractModel
{
}
是否可以在模型的__construct
方法中注入依赖项?当我尝试时,最终出现以下错误。
致命错误:无法实例化抽象类Magento \ Framework \ Model \ ResourceModel \ AbstractResource
罪魁祸首似乎是AbstractModel
的__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模型中?