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?
sumber
Ini tampaknya aman. Setidaknya, Magento melakukan ini di sejumlah tempat. Lihat metode __construct dalam daftar kelas (tidak eksklusif) berikut untuk contoh
Sayangnya, saya tidak dapat menjawab bagian lain dari pertanyaan Anda.
sumber
$mine
adalah parameter yang diperlukan , sementara$resource
,$resourceCollection
dan$data
bersifat opsional . Parameter opsional harus selalu menjadi yang terakhir, jika tidak, tidak mungkin untuk bekerja dengan mereka seperti dengan opsional. Jadi sepertinya OK bagi saya bahwa Anda harus menentukan$mine
sebelum parameter opsional.sumber
$mine
ke bagian depan antrian akan membuat kesalahan. Jika kode sistem inti Magento tidak menggunakannya maka mengapa mereka ada di sana? Itulah pertanyaan yang saya coba sampaikan. Hanya karena saya dapat menggunakan model saya dengan parameter yang dipindahkan tidak membuatnya aman.$mine
sebelum parameter opsional, mereka menjadi sangat opsional dan Magento hanya melewati nilai default (null
,array()
). Jika Anda meletakkan parameter yang diperlukan setelah yang opsional, PHP menganggap parameter opsional sebagai yang diperlukan dan Magento mencoba untuk instantiate mereka (tetapi tidak ada preferensi untuk mereka).