Dalam di.xml
yang dilengkapi dengan Magento2 ada simpul type
dan simpul virtualType
. Pertanyaan saya adalah apa ini virtualType
dan dalam hal apa seharusnya itu digunakan type
?
Di beberapa tempat sepertinya tautan simbolis atau menulis ulang:
<virtualType name="Magento\Core\Model\Session\Storage" type="Magento\Framework\Session\Storage">
Di mana satu path lengkap diubah menjadi yang lain tetapi di tempat lain tampaknya digunakan sebagai cara untuk mendefinisikan alias lebih pendek.
<virtualType name="lessFileSourceBase" type="Magento\Framework\View\File\Collector\Base">
magento2
dependency-injection
virtualtype
David Manners
sumber
sumber
Magento\Framework\ObjectManager\Config\Mapper\Dom::convert
. Adaswitch
pernyataan di sana di suatu tempat.lessFileSourceBase
terbatas pada xml atau apakah itu juga dapat digunakan di luar. Kira saya lebih baik menggali.Jawaban:
Tipe virtual adalah cara untuk menyuntikkan dependensi yang berbeda ke dalam kelas yang ada tanpa mempengaruhi kelas lain.
Sebagai contoh,
Magento\Framework\Session\Storage
kelas mengambil$namespace
argumen dalam konstruktornya, yang default ke nilai 'default', dan Anda bisa menggunakantype
definisi untuk mengubah namespace menjadi 'core'.Konfigurasi di atas akan membuatnya sehingga semua instance
Magento\Framework\Session\Storage
memiliki namespace 'core'. Menggunakan tipe virtual memungkinkan untuk setara dengan sub-kelas yang akan dibuat, di mana hanya sub-kelas yang memiliki nilai argumen yang diubah.Dalam basis kode kita melihat dua konfigurasi berikut:
Cuplikan pertama membuat tipe virtual
Magento\Core\Model\Session\Storage
yang mengubah namespace, dan yang kedua menyuntikkan tipe virtualMagento\Framework\Session\Generic
. Ini memungkinkanMagento\Framework\Session\Generic
untuk dikustomisasi tanpa mempengaruhi kelas-kelas lain yang juga menyatakan ketergantunganMagento\Framework\Session\Storage
sumber
<type>
menggunakan kelas virtual yang sebenarnya tidak ada. Dengan cara ini argumen modifikasi dalamvirtualType
akan berlaku hanya ketika kelas menggunakan virtualType diinisialisasi yang adaMagento\Framework\Session\Generic
dalam contohCara lain untuk memahami tipe virtual -
Katakanlah Anda memiliki kelas
\Class1
, yang memiliki konstruktor berikut -Dan
\Class2
memiliki konstruktor berikut -Sekarang, Anda ingin mengubah jenis
$argOfClass2
dari\Class3
menjadi\Class4
, tetapi hanya ketika\Class2
digunakan sebagai$argOfClass1
.Cara "lama" untuk melakukannya adalah dengan menambahkan yang berikut di
di.xml
-dimana
\Class5
yang berikut ini:Alih-alih menggunakan cara ini, Anda bisa menggunakan tipe virtual untuk mencapai hal yang sama, dengan menambahkan yang berikut ke
di.xml
:Seperti yang Anda lihat, menggunakan tipe virtual menyelamatkan Anda karya penciptaan
Class5
.Untuk referensi lebih lanjut saya sarankan untuk membaca artikel Alan Storm mengenai tipe virtual di Magento2 - http://alanstorm.com/magento_2_object_manager_virtual_types/
sumber
Dalam
di.xml
file yang sama saya menemukan yanglessFileSourceBase
dilewatkan sebagai argumen untuklessFileSourceBaseFiltered
yang dilewatkan sebagai argumen untuklessFileSourceBaseSorted
yang dilewatkan sebagai argumen untuk tipeMagento\Framework\Less\File\Collector\Aggregated
.Saya tidak menemukan kejadian lain
lessFileSourceBase
(ataulessFileSource
) di file lain kecualidi.xml
dari modul inti. Hanya di beberapa file cache tetapi itu tidak penting.Saya kira jika Anda tidak akan menggunakan tipe virtual dalam kelas PHP, tetapi hanya dalam
di
file xml maka Anda tidak diharuskan untuk membuatnya terlihat seperti nama kelas dan Anda dapat menggunakan alias.Tapi ini hanya spekulasi murni.
Akan "menyenangkan" untuk mencoba membuat kelas dan menyuntikkan konstruktor sebagai contoh
lessFileSourceBase
untuk melihat bagaimana perilakunya.sumber
\Magento\Framework\Session\Generic
bergantung pada file sumberMagento\Core\Model\Session\Storage
alih-alih,StorageInterface
Anda harus mendapatkan pengecualian 'Kelas Magento \ Core \ Model \ Session \ Storage tidak ada'. Alasannya adalah bahwa ObjectManager tidak membuat turunan dari virtualType, tetapi hanya menggunakannya untuk menentukan argumen apa yang disediakan untuk konstruktor dari tipe konkret yang dirujuk oleh definisi virtualType (Magento\Framework\Session\Storage
untuk contoh di atas).$requestedType
mewakili tipe virtual dan digunakan untuk mengumpulkan argumen, tetapi$type
adalah tipe konkret yang dipetakan oleh virtualType dan digunakan untuk panggilan instanceasi objek.lessFileSourceBase
berada dalam gaya tipe namespace \ kelas yang lebih, itu tidak akan memungkinkan untuk referensi langsung oleh kelas php lain, hanya untuk injeksi melalui di.xml