DI & Magento 2'de Blok Genişletme


15

Magento 2 bağımlılık enjeksiyonunu bloklarla kavramaya çalışıyorum, her seferinde \ Magento \ Framework \ View \ Element \ Template olmayan bir bloğu genişletmeye çalışıyorum .

Magento \ Theme \ Block \ Html \ Header \ Logo'nun çok temel blok sınıfını genişleten bir blok oluşturmak istiyorum - construct yöntemi içinde bağımlılık enjeksiyonunu deneyene kadar her şey iyi çalışıyor:

<?php

namespace Creare\Test\Block\Header;

class Logo extends \Magento\Theme\Block\Html\Header\Logo
{

    protected $_creareHelper;

    public function __construct(
        \Magento\Framework\View\Element\Template\Context $context,
        \Creare\Seo\Helper\Data $creareHelper,
        array $data = []
    )
    {
        $this->_creareHelper = $creareHelper;
        parent::__construct($context, $data);
    }
}

Yardımcı sınıfımı (veya bu konu için başka bir şey) enjekte etmeye çalıştığımda, aşağıdaki hatayla başlayan bir yığın izlemesi alıyorum:

Recoverable Error: Argument 2 passed to Magento\Theme\Block\Html\Header\Logo::__construct() must be an instance of Magento\MediaStorage\Helper\File\Storage\Database, array given, called in /Users/adammoss/PhpstormProjects/Magento2/app/code/Creare/Test/Block/Header/Logo.php on line 17 and defined in /Users/adammoss/PhpstormProjects/Magento2/app/code/Magento/Theme/Block/Html/Header/Logo.php on line 33

Eğer onunla genişlettiğim dosya olarak benim __construct ile aynı bağımlılıkları eklerseniz, ama bu sınıf mirasının noktası olarak bir şeyler yapmanın geriye dönük bir yolu tüm ebeveynin yöntem ve özelliklerini absorbe mi?

Ben sadece sınıflardan uzanan ve Magento 2 ile DI kullanarak birinden temel 101 açıklamasına ihtiyacım olduğunu düşünüyorum. Herhangi bir yardım çok takdir!


“elbette bu bir şeyler yapmanın geriye dönük bir yolu” diye kabul etti.
James

Yanıtlar:


19

Genişletmeye çalıştığınız sınıf bu kurucuya sahiptir:

public function __construct(
    \Magento\Framework\View\Element\Template\Context $context,
    \Magento\MediaStorage\Helper\File\Storage\Database $fileStorageHelper,
    array $data = []
) {
    $this->_fileStorageHelper = $fileStorageHelper;
    parent::__construct($context, $data);
}

bu yüzden yapıcıyı böyle göstermelisin

public function __construct(
    \Magento\Framework\View\Element\Template\Context $context,
    \Magento\MediaStorage\Helper\File\Storage\Database $fileStorageHelper,
    \Creare\Seo\Helper\Data $creareHelper,
    array $data = []
)
{
    $this->_creareHelper = $creareHelper;
    parent::__construct($context, $fileStorageHelper, $data);
}

Sonuç ...
Çocuk sınıflarınızda tüm ana sınıf yapıcı parametrelerini ve yeni parametrelerini belirtmeniz gerekir. Siparişin önemli olduğunu düşünmüyorum ve en iyi uygulamanın ne olduğunu bilmiyorum.
Daha sonra yapıcıda yeni enjekte edilen nesneleri üye değişkenlere atarsınız ve üst yapıcıya aynı sayıda parametre ile çağırırsınız.


2
Cevabınız için bu mantıklı. Sanırım bundan daha zarif olmasını umuyordum.
Adam Moss

@Marius argümanlarının üst sınıf __construct yöntem argümanlarıyla aynı olması gerekir, özel argümanlarınızın sonunda geçmesi gerekir.
chirag dodia

@chiragdodia Neden? Ben öyle düşünmüyorum. M2 üzerinde şimdiye kadar yaptığım her şey, rastgele özel inşa argümanlarını kullanarak inşa ettim. Ve işe yaradı. tek kısıtlama, varsayılan değeri olan argümanların sürmesi gerektiğidir.
Marius

@Marius evet bazı durumlarda çalışıyor, ancak benim durumumda \ Magento \ Katalog \ Blok \ Ürün \ Çalışma değil Görünüm üst yapıcı ile aynı argüman sırasını yapmak gerekir ve sonunda özel argümanlar ekledi gerekir. Koduma
chirag dodia

\ Magento \ Müşteri \ Blok \ Form \ Kayıt Bloğu'nu geçersiz kılmaya çalıştığımda benim için çalışmıyor
DEEP JOSHI
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.