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!
Jawaban:
Kelas yang Anda coba perpanjang memiliki konstruktor ini:
jadi Anda perlu membuat konstruktor Anda terlihat seperti ini
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.
sumber