Ich habe anscheinend Probleme, die Magento 2-Abhängigkeitsinjektion mit Blöcken zu erfassen, und jedes Mal, wenn ich versuche, einen Block zu erweitern, der nicht \ Magento \ Framework \ View \ Element \ Template ist, treten Fehler auf.
Ich möchte einen Block erstellen, der die grundlegende Blockklasse von Magento \ Theme \ Block \ Html \ Header \ Logo erweitert - alles funktioniert einwandfrei, bis ich die Abhängigkeitsinjektion innerhalb der Konstruktmethode versuche:
<?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);
}
}
Sobald ich versuche, meine Helfer-Klasse (oder irgendetwas anderes) zu injizieren, erhalte ich einen Stack-Trace, der mit dem folgenden Fehler beginnt:
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
Wenn ich meinem __construct die gleichen Abhängigkeiten hinzufüge, wie die Datei, die ich von ihr aus erweitere, funktioniert, ist dies sicherlich eine umgekehrte Vorgehensweise, da der Punkt der Klassenvererbung darin besteht, dass ich alle Methoden und Eigenschaften des übergeordneten Elements übernehme.
Ich denke, ich brauche nur eine grundlegende Erklärung von jemandem zum Erweitern von Klassen und Verwenden von DI mit Magento 2. Jede Hilfe sehr geschätzt!
Antworten:
Die Klasse, die Sie erweitern möchten, hat folgenden Konstruktor:
Sie müssen also Ihren Konstruktor so aussehen lassen
Schlussfolgerung ...
In Ihren untergeordneten Klassen müssen Sie alle übergeordneten Klassenkonstruktorparameter sowie Ihre neuen Parameter angeben. Ich denke nicht, dass die Reihenfolge wichtig ist, und ich weiß nicht, was die beste Vorgehensweise ist.
Anschließend weisen Sie im Konstruktor Ihre neuen injizierten Objekte den Member-Variablen zu und rufen den übergeordneten Konstruktor mit der gleichen Anzahl von Parametern auf, die er benötigt.
quelle