DI和Magento 2上的扩展块


15

每当我尝试扩展不是\ Magento \ Framework \ View \ Element \ Template的块时,我似乎都难以理解带有块的Magento 2依赖项注入,但最终会出错。

我想创建一个扩展Magento \ Theme \ Block \ Html \ Header \ Logo的非常基本的块类的 -一切正常,直到我尝试在construct方法中进行依赖注入:

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

一旦我尝试注入我的助手类(或与此有关的任何其他东西),我就会得到一个堆栈跟踪,并从以下错误开始:

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

如果我在我的__construct文件中添加与我正在扩展的文件相同的依赖关系,但是肯定是一种倒退的处理方式,因为类继承的要点是我吸收了父级的所有方法和属性?

我想我只需要某人提供关于扩展类以及在Magento 2中使用DI的基本101解释。非常感谢您的帮助!


“当然,这是一种倒退的方式”
詹姆斯

Answers:


19

您尝试扩展的类具有以下构造函数:

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

所以你需要让你的构造器看起来像这样

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

结论...
在子类中,您需要指定所有父类构造函数参数以及新的参数。我认为顺序并不重要,也不知道最佳实践是什么。
然后,在构造函数中,将新注入的对象分配给成员vars,并使用所需数量的参数调用父构造函数。


2
非常感谢您的回答。我想我只是希望它比这更优雅。
亚当·莫斯

@Marius参数的顺序需要与父类__construct方法参数相同,您的自定义参数必须在最后传递。
chirag dodia

@chiragdodia为什么?我不这么认为。到目前为止,我使用随机添加的自定义构造参数在M2上构建的所有内容。而且有效。唯一的限制是具有默认值的参数应排在最后。
马吕斯

@Marius是的,它在某些情况下可以工作,但是在我的情况下,当我扩展\ Magento \ Catalog \ Block \ Product \ View无效时,我需要使参数顺序与父构造函数中的顺序相同,并最后添加自定义参数。看看我的代码在这里magento.stackexchange.com/questions/95697/...
CHIRAG dodia

当我尝试覆盖\ Magento \ Customer \ Block \ Form \ Register块时,它对我不起作用
DEEP JOSHI
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.