DI ed estensione di un blocco su Magento 2


15

Mi sembra che stia faticando a cogliere l'iniezione di dipendenza Magento 2 con i blocchi, ogni volta che provo ad estendere un blocco che non è \ Magento \ Framework \ View \ Element \ Template finisco con errori.

Voglio creare un blocco che estende la classe di blocco di base di Magento \ Theme \ Block \ Html \ Header \ Logo - tutto funziona bene fino a quando non provo l'iniezione di dipendenza nel metodo di costruzione:

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

Non appena provo a iniettare la mia classe helper (o qualsiasi altra cosa, ottengo una traccia dello stack che inizia con il seguente errore:

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

Se aggiungo le stesse dipendenze al mio __costruct come funziona il file che sto estendendo da esso, ma sicuramente è un modo all'indietro di fare le cose come il punto di eredità della classe è che assorbo tutti i metodi e le proprietà del genitore?

Penso di aver bisogno di una spiegazione di base 101 da parte di qualcuno sull'estensione delle lezioni e sull'utilizzo di DI con Magento 2. Qualsiasi aiuto molto apprezzato!


"sicuramente è un modo di fare le cose all'indietro" concordato.
James,

Risposte:


19

La classe che stai tentando di estendere ha questo costruttore:

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

quindi devi far sembrare il tuo costruttore così

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

Conclusione ...
Nelle classi secondarie è necessario specificare tutti i parametri del costruttore della classe genitore più i nuovi parametri. Non penso che l'ordine sia importante e non so quale sia la migliore pratica.
Quindi nel costruttore si assegnano i nuovi oggetti iniettati ai membri membri e si chiama il costruttore principale con lo stesso numero di parametri richiesti.


2
Questo ha senso grazie per la tua risposta. Immagino sperassi solo che fosse più elegante di così.
Adam Moss,

L'ordine degli argomenti di @Marius deve essere uguale agli argomenti del metodo __construct della classe genitore, gli argomenti personalizzati devono passare alla fine.
Chirag Dodia,

@chiragdodia Why? Io non la penso così. Tutto ciò che ho costruito finora su M2 l'ho creato usando gli argomenti di costruzione personalizzati aggiunti casualmente. E ha funzionato. l'unico vincolo è che gli argomenti con un valore predefinito dovrebbero andare per ultimi.
Marius

@Marius sì, funziona in alcuni casi, ma nel mio caso quando ho esteso \ Magento \ Catalog \ Block \ Product \ View non funziona ho bisogno di fare lo stesso ordine di argomenti come nel costruttore principale e infine ho aggiunto argomenti personalizzati. Dai un'occhiata al mio codice qui magento.stackexchange.com/questions/95697/…
chirag dodia,

Non funziona per me quando ho provato a scavalcare \ Magento \ Customer \ Block \ Form \ Register Block
DEEP JOSHI
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.