Ok, jadi kemarin kami melakukan pembicaraan besar dengan orang lain dari komunitas Magento mengenai penggunaan langsung ObjectManager
di kelas / templat .
Saya sudah mengetahui alasan mengapa kita tidak boleh menggunakan ObjectManager secara langsung, mengutip Alan Kent :
Ada beberapa alasan. Kode akan berfungsi, tetapi merupakan praktik terbaik untuk tidak merujuk kelas ObjectManager secara langsung.
- Karena kami bilang begitu! ;-) (lebih baik dinyatakan sebagai kode konsisten adalah kode yang baik)
- Kode ini dapat digunakan dengan kerangka kerja injeksi ketergantungan yang berbeda di masa mendatang
- Pengujian lebih mudah - Anda memberikan argumen tiruan untuk kelas yang diperlukan, tanpa harus menyediakan ObjectManager tiruan
- Itu membuat dependensi lebih jelas - jelas apa kode tergantung melalui daftar konstruktor, daripada memiliki dependensi tersembunyi di tengah-tengah kode
- Ini mendorong programmer untuk berpikir tentang konsep-konsep seperti enkapsulasi dan modularisasi yang lebih baik - jika konstruktor menjadi besar, mungkin itu adalah tanda bahwa kode perlu refactoring
Dari apa yang saya lihat di StackExchange, banyak orang cenderung mencari solusi mudah / pendek / tidak direkomendasikan, misalnya sesuatu seperti ini:
<?php
//Get Object Manager Instance
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
//Load product by product id
$product = $objectManager->create('Magento\Catalog\Model\Product')->load($id);
Alih-alih melalui proses yang menyakitkan tetapi direkomendasikan :
- membuat modul
- mendeklarasikan preferensi
- menyuntikkan dependensi
- mendeklarasikan metode publik
Namun, dan inilah dilema, file inti Magento 2 sering memanggil ObjectManager secara langsung . Contoh cepat dapat ditemukan di sini: https://github.com/magento/magento2/blob/develop/app/code/Magento/GoogleOptimizer/Block/Adminhtml/Form.php#L57
Jadi inilah pertanyaanku:
- Mengapa Magento melakukan apa yang mereka sarankan agar kita tidak lakukan? Apakah itu berarti ada beberapa kasus di mana kita harus menggunakan
ObjectManager
secara langsung ? Jika demikian, apa sajakah kasus-kasus itu? - Apa konsekuensi menggunakan ObjectManager secara langsung ?
The intent of zend-servicemanager is for use as an Inversion of Control container. It was never intended as a general purpose service locator [...]
. Yang berlaku untuk M2 juga. Periksa juga There are valid use cases
bagian yang juga berlaku di sini.