Tamam, dün, Magento topluluğunun diğer insanlarıyla sınıfların / şablonların doğrudan kullanımıObjectManager
konusunda büyük bir konuşma yaptık .
Alan Kent'ten alıntı yaparak ObjectManager'ı doğrudan kullanmamamızın nedenlerinin farkındayım :
Birkaç sebep var. Kod işe yarar, ancak ObjectManager sınıfına doğrudan başvurmamak en iyisidir.
- Çünkü biz öyle diyoruz! ;-) (daha iyi tutarlı kod olarak ifade edilir iyi koddur)
- Kod gelecekte farklı bir bağımlılık enjeksiyon çerçevesiyle kullanılabilir
- Test etmek daha kolaydır - sahte bir ObjectManager vermek zorunda kalmadan, istenen sınıf için sahte argümanlara geçersiniz
- Bağımlılıkları daha net tutar - kodun ortasında saklı bağımlılıklardan ziyade, kodun yapıcı listesi üzerinden neye bağlı olduğu açıktır.
- Programcıları kapsülleme ve modülerleştirme gibi kavramlar hakkında daha iyi düşünmeye teşvik eder - eğer yapıcı büyürse, kodun yeniden yapılandırılması gereken bir işaret olabilir.
StackExchange'te gördüklerime göre, birçok insan örneğin kolay / kısa / tavsiye edilmeyen bir çözüm bulma eğilimindedir :
<?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);
Acı verici ama önerilen bir işlemden geçmek yerine :
- modül oluşturma
- tercihleri bildirme
- bağımlılıkları enjekte etmek
- genel bir yöntem belirtmek
Ancak ve işte ikilem geliyor, Magento 2 çekirdek dosyaları genellikle doğrudan ObjectManager'ı çağırır . Hızlı bir örnek burada bulunabilir: https://github.com/magento/magento2/blob/develop/app/code/Magento/GoogleOptimizer/Block/Adminhtml/Form.php#L57
Sorularım işte burada:
- Magento neden yapmamamızı önerdiği şeyi yapıyor? Bu
ObjectManager
doğrudan kullanmamız gereken bazı durumlar olduğu anlamına mı geliyor ? Eğer öyleyse, bu davalar nelerdir? - ObjectManager'ı doğrudan kullanmanın sonuçları nelerdir ?
The intent of zend-servicemanager is for use as an Inversion of Control container. It was never intended as a general purpose service locator [...]
. M2 için de geçerli. Ayrıca There are valid use cases
burada da geçerli olan kısmı kontrol edin .