Magento 2 Yardımcı örneği


11

Kafamı Magento 2'den DI sisteminin etrafına sardığımı düşündüğümde bir şey ortaya çıkıyor ve çözülüyor.
Çekirdek kodda bir yardımcıya erişmek için farklı yollar görüyorum.
Örneğin Magento\Catalog\Controller\Category::_initCategoryburada:

if (!$this->_objectManager->get('Magento\Catalog\Helper\Category')->canShow($category)) {
    return false;
}

Ama Magento\Catalog\Block\Category\Viewyardımcıya yapıcıya enjekte edilir

public function __construct(
    \Magento\Framework\View\Element\Template\Context $context,
    \Magento\Catalog\Model\Layer\Category $catalogLayer,
    \Magento\Framework\Registry $registry,
    \Magento\Catalog\Helper\Category $categoryHelper,
    array $data = array()
) {
    $this->_categoryHelper = $categoryHelper;
    $this->_catalogLayer = $catalogLayer;
    $this->_coreRegistry = $registry;
    parent::__construct($context, $data);
}

Bu bana yardımcıların kontrolörlerde ve bloklarda (ve modellerde) farklı şekilde erişilmesi gerektiğini düşündürdü, ancak daha sonra yapıcıya bir yardımcı enjekte edildiği bir kontrolör buldum Magento\Catalog\Controller\Adminhtml\Product\Action\Attribute.

Lütfen benim için sisi temizleyin.
Ne zaman DI kullanmalıyım ve ne zaman kullanmalıyım objectManager? ve neden?
Bu soruyu okudum: Magento 2'deki Yardımcıları Oluşturma . Bu sadece bununla ilgili bir soru.

Yanıtlar:


10

Mümkün olduğunda DI'yi tercih ederim, çünkü nesne yöneticisini kullanmak zaten demeter yasalarına aykırıdır. Nesne yöneticisini kullanırken bu bağımlılıklar yöntem mantığında gizlidir.


Evet. Katılıyorum. DI'yi kullanacağım, ancak bunun neden çekirdekte yapıldığını merak ediyorum? Belki biri daha önce bahsettiğim sınıfları tekrar gözden geçiremedi?
Marius

Afaik hala çok fazla yeniden düzenleme yapıyorlar ve umarım bu yerlere de dokunacaklar. Ama aynı zamanda bir noktada serbest bırakmak istedikleri zaman var olması gereken öncelikleri de bilmiyorum. Bu yüzden belki önce bazı yeni özellikler veya diğer kötü uygulamalar düzeltilecektir.
Tobias

10 işlev sınıfınız varsa ve SADECE 1 işlev belirli bir model gerektiriyorsa ne olur? Yalnızca 1 tek işlev içinde nesne yöneticisi kullanarak yüklerken 10 işlevden her biri için yapıcı enjeksiyonu yoluyla model yüklemek için (performans görünümünden) gereksiz olmaz mı?
JohnyFree

6

Magento uygulaması hakkında çok şey bilmiyorum, ama ObjectManagerbir Servis Bulucu gibi görünüyor .

Genellikle bir nesnedeki bağımlılıklara erişmek için bir Servis Bulucu kullanmak oldukça kötüdür, bu makaleye göz atın .

Bağımlılıklarınızı bir kurucu aracılığıyla açıkça tanımlamak çok daha iyi bir yaklaşımdır. Ünite testine ve tanımlanmayan servislerle çalışma süresi sorunlarına yardımcı olur.

Nesne Yöneticisi'ni bir sınıfa enjekte etmek, temel olarak, sınıfınıza tüm uygulama hizmetlerinize erişimi olan bir kayıt defteri enjekte eder, ki bu doğru değildir.

Kullandığım ZF2 adil biraz ve genellikle Hizmetleri Kontrolörleri ve bağımlılıkları gerektiren herhangi bir sınıf için küçük fabrika sınıfları tanımlar. Bu fabrika sınıfları Servis Bulucu'ya erişebilir ve nesnenin bağlı olduğu tüm hizmetleri alır ve bunları kurucu aracılığıyla enjekte eder. Çoğunlukla, böyle bir şey kodunu atmak gibi bir fabrika sınıfında Servis Bulucu Kullanımı gayet bu örneğin.

Bu fabrikaların test edilmesi hala kolaydır .

IMO, Mümkün olan yerlerde yapıcı enjeksiyonu kullanın. Yine, Magento'nun uygulaması hakkında çok fazla şey bilmiyorum ve Fabrikalar kavramına sahipse, hızlı bir bakıştan onları destekliyor gibi görünüyor, ancak sınıflarınızı açıkça tanımlamak ve bunları Fabrika sınıflarında oluşturmak için bir Servis Bulucu kullanmak çok daha temiz bir yaklaşım.

Bu, yukarıda bahsedilen desenlere sınırlı maruz kalan birinden, bu yüzden başkalarının konuyla ilgili düşüncelerini / deneyimlerini duymak istiyorum!

Daha fazla okuma


Güzel açıklama için teşekkürler. Sorum şuydu: "Neden özde bir yardımcıya erişmenin 2 yolu var?" bu biraz konu dışı ama başka şüphelerim de oldu. :) Teşekkürler.
Marius

Muhtemelen henüz henüz yeniden düzenlenmemiş bir şey olduğunu söyleyebilirim. Ya bu ya da kullanım kolaylığı olabilir. Tüketicilerin tüm bağımlılıklarını her zaman bir Denetleyiciye enjekte etmesini istemek, özellikle RAD yaparken karşı üretken olarak görülebilir. Tüketicilere bağımlılıklara her iki şekilde erişim vermek RAD yaklaşımına izin verir, ancak yine de başkalarının istedikleri takdirde bağımlılıklarını açıkça tanımlamasına izin verir.
Aydin Hassan

5

Yardımcıyı (şablonlarda) kullanmanın başka bir yolu:

$this->helper('[Vendor]\[Module]\Helper\[Helper Name]')->getMethodName();

Umarım henüz bilmediyseniz faydalıdır.


bu bir şekilde nesne yöneticisini kullanmaya benzer. Bunun en iyi fikir olduğundan emin değilim.
Marius

1
Yukarıdaki yöntem sadece bildiğim kadarıyla şablonlar içindir. Nesne yöneticisi kontrolörlerde, bloklarda, modellerde vb. Kullanılır
rbncha

1
Şablonlarla kod bağımlılığı olmadığından kodla aynı basketbol sahası içinde değildir. Şablonlar yalnızca tüketicidir ve kapsülleme bozuk olan müşterileri kirletmez.
demonkoryu

Demonkoryu'nun ne demeye çalıştığını bilmiyorum. Ancak herhangi bir modülün yardımcısını çağırmanın en iyi yolu budur. Bu Magento. Dedikleri gibi, her blok / bölüm kodu çekirdeğe dokunmadan çağrılabilir / değiştirilebilir niteliktedir. Yani, her şey birbiriyle ilişkilidir veya bağımlılıkları vardır.
rbncha

2

Eski bir soru olmasına rağmen, Marius'un cevabını alıp almadığından emin değilim . Marius'un daha iyi cevap verebileceğine inanıyorum . Kısaca cevaplamak istiyorum. Magento 2 neden yardımcı yerine DI kullanılmasını öneriyor?

  • Birim testinde izolasyonu mümkün / kolay hale getirmek
  • Bir sınıfın bağımlılıklarını açıkça tanımlama
  • İyi tasarımı kolaylaştırmak (örneğin, tek sorumluluk ilkesi (SRP))
  • Modülünüzde DI kullanımı Magento bu arayüzlerin temel uygulamalarını değiştirdiğinde uyumsuzluk hataları riskini azaltır. Bu, uzantı geliştiricileri için anlaşılması gereken önemli bir kavramdır.

M2 çekirdeği neden bazı durumlarda DI kullanmıyor?

  • Sınıf sayısında azalma
  • Gereksiz arayüzler yaratmamak
  • Uyumsuzluk hatası riski yok

Core katalog modülü yardımcı kullanılmasına rağmen DI'yi yoğun olarak kullanmıştır. Araştırmamda Magento 2'nin Temel Katalog yardımcı dosyalarında Servis Sözleşmeleri için uygun olmayan birkaç işlev kullandığını gördüm.

Magento tanımlı bir sınıfı (\ Magento \ Catalogue \ Model \ Product gibi) açıkça kullanmanız gerekiyorsa, hizmet sözleşmesi arabirimi yerine somut uygulamaya bağlı olarak örtük bağımlılığı açıkça belirtin.

Şüphesiz, uzantı geliştiricisi Yardımcı gibi Magento1 yerine DI kullanmalıdır. Magento 2'nin kurallarına göre uygularken, serpinti sınırlıdır. Öneriler kırılırken sorunlar meydana gelir.


Evet, bu arada cevabımı aldım. Ama cevap vermek için zaman ayırdığınız için teşekkürler. Bu, çevrimiçi olarak arama yapan kullanıcılar için değerli bilgilerdir.
Marius
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.