DI & Memperluas Blok di Magento 2

15

Saya tampaknya berjuang untuk memahami injeksi ketergantungan Magento 2 dengan blok, setiap kali saya mencoba untuk memperpanjang blok yang bukan \ Magento \ Framework \ View \ Element \ Template Saya berakhir dengan kesalahan.

Saya ingin membuat blok yang memperluas kelas blok yang sangat mendasar dari Magento \ Theme \ Block \ Html \ Header \ Logo - semuanya berfungsi dengan baik sampai saya mencoba injeksi ketergantungan dalam metode konstruk:

<?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);
    }
}

Segera setelah saya mencoba menyuntikkan kelas pembantu saya (atau apa pun hal itu, saya mendapatkan jejak tumpukan dimulai dengan kesalahan berikut:

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

Jika saya menambahkan dependensi yang sama ke __construct saya karena file yang saya panjangkan tidak berfungsi, tetapi tentunya itu adalah cara terbelakang dalam melakukan berbagai hal karena titik warisan kelas adalah apakah saya menyerap semua metode dan properti orangtua?

Saya rasa saya hanya perlu penjelasan dasar 101 dari seseorang tentang perluasan dari kelas dan menggunakan DI dengan Magento 2. Setiap bantuan sangat dihargai!

Adam Moss
sumber
"Pasti itu cara mundur untuk melakukan sesuatu," Setuju.
James

Jawaban:

19

Kelas yang Anda coba perpanjang memiliki konstruktor ini:

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);
}

jadi Anda perlu membuat konstruktor Anda terlihat seperti ini

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);
}

Kesimpulan ...
Di kelas anak Anda, Anda perlu menentukan semua params konstruktor kelas induk ditambah param baru Anda. Saya tidak berpikir urutannya penting, dan saya tidak tahu apa praktik terbaiknya.
Kemudian dalam konstruktor Anda menetapkan objek baru yang disuntikkan ke vars anggota dan memanggil induk konstruktor dengan jumlah parameter yang sama yang diperlukan.

Marius
sumber
2
Masuk akal terima kasih atas jawaban Anda. Saya kira saya hanya berharap itu lebih elegan dari itu.
Adam Moss
@Marius urutan argumen harus sama dengan argumen metode induk __construct kelas induk, argumen khusus Anda harus lulus di akhir.
chirag dodia
@chiragdodia Kenapa? Saya kira tidak. Semua yang saya bangun sejauh ini di M2 saya dibangun menggunakan argumen kustom membangun ditambahkan secara acak. Dan itu berhasil. satu-satunya kendala adalah bahwa argumen dengan nilai default harus menjadi yang terakhir.
Marius
@Marius ya itu berfungsi dalam beberapa kasus tetapi dalam kasus saya ketika saya telah memperpanjang \ Magento \ Catalogue \ Block \ Product \ Lihat itu tidak berfungsi saya perlu membuat urutan argumen yang sama seperti pada induk konstruktor dan akhirnya menambahkan argumen kustom. Lihatlah kode saya di sini magento.stackexchange.com/questions/95697/…
chirag dodia
Ini tidak berfungsi untuk saya ketika saya mencoba untuk menimpa \ Magento \ Pelanggan \ Blok \ Formulir \ Daftar Blok
DEEP JOSHI