Apakah mungkin untuk menyuntikkan ketergantungan ke model Magento 2 CRUD?
Itulah - Magento 2 memiliki kelas model abstrak dasar: Magento\Framework\Model\AbstractModel
. Jika Anda ingin membuat objek model Buat, Baca, Perbarui, Hapus yang sederhana, Anda perluas kelas ini dengan kelas Anda sendiri.
class Foo extends Magento\Framework\Model\AbstractModel
{
}
Apakah mungkin untuk menyuntikkan dependensi dalam __construct
metode model Anda ? Ketika saya mencoba, saya akhirnya mendapatkan kesalahan berikut.
Kesalahan fatal: Tidak dapat membuat instance kelas abstrak Magento \ Framework \ Model \ ResourceModel \ AbstractResource
Pelakunya tampaknya menjadi AbstractModel
's __construct
metode.
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 = []
) {
Ada dua jenis petunjuk dalam konstruktor ini ( Magento\Framework\Model\ResourceModel\AbstractResource
, Magento\Framework\Data\Collection\AbstractDb
) yang bukan antarmuka manajer objek Magento. Itu kelas abstrak. Ketika saya memperluas kelas ini dan mencoba untuk menambahkan ketergantungan saya yang disuntikkan
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 menebus ketika manajer objek mencoba untuk membuat instance kelas abstrak.
Saya bisa "memperbaiki" ini dengan memindahkan ketergantungan objek saya di depan kelas abstrak
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 = [],
) {
Namun, ini mengubah urutan argumen. Di kelas yang sepenuhnya objek dikelola, ini tidak akan menjadi masalah. Namun, fakta bahwa petunjuk tipe kelas abstrak ini ada menyiratkan ada bagian dari sistem Magento yang akan secara manual (yaitu tidak melalui manajer objek atau DI) instantiate objek CRUD dan mengirimkan objek yang sesuai dengan petunjuk tipe dalam urutan tertentu .
Apakah ini aman? yaitu apakah kelas abstrak ini dalam konstruktor model abstrak hanya kode warisan, dan tidak digunakan? Atau apakah bagian-bagian dari sistem masih menggunakan ini, artinya tidak mungkin untuk menyuntikkan dependensi ke dalam model CRUD?