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オブジェクトマネージャーインターフェイスではない 2つのタイプヒントがあります(Magento\Framework\Model\ResourceModel\AbstractResource
、Magento\Framework\Data\Collection\AbstractDb
)。それらは抽象クラスです。このクラスを拡張し、注入された依存関係を追加しようとすると
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 = [],
) {
ただし、これにより引数の順序が変更されました。完全にオブジェクト管理されたクラスでは、これは問題になりません。ただし、これらの抽象クラスのタイプヒントが存在するという事実は、手動で(つまり、オブジェクトマネージャーまたはDIを介さずに)CRUDオブジェクトをインスタンス化し、その特定の順序でタイプヒントに適合するオブジェクトを渡すMagentoシステムの一部があることを意味します。
これは安全ですか?すなわち、抽象モデルのコンストラクタのこれらの抽象クラスは単なるレガシーコードであり、使用されていませんか?または、システムの一部はまだこれらを使用しますか?つまり、CRUDモデルに依存関係を注入することはできませんか?