Magento 2 CRUD 모델에 의존성을 주입 할 수 있습니까?
즉, Magento 2에는 기본 추상 모델 클래스가 Magento\Framework\Model\AbstractModel
있습니다. 간단한 Create, Read, Update, Delete 모델 객체를 만들려면이 클래스를 자신의 클래스로 확장하십시오.
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);
}
}
객체 관리자가 추상 클래스를 인스턴스화하려고 시도하면 마 젠토가 중단됩니다.
나는 객체 의존성을 추상 클래스들 앞에서 움직여서 이것을 고칠 수있다
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 모델에 의존성을 주입 할 수 없습니까?