Magento 2의 DI 및 블록 확장


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를 사용하는 것에 대한 기본 설명이 필요하다고 생각합니다.


"확실히 그것은 역행하는 방법이다" Agreed.
James

답변:


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

결론 ...
하위 클래스에서는 모든 상위 클래스 생성자 매개 변수와 새 매개 변수를 지정해야합니다. 나는 순서가 중요하다고 생각하지 않으며 모범 사례가 무엇인지 모른다.
그런 다음 생성자에서 새로운 주입 된 객체를 멤버 변수에 할당하고 필요한 수의 매개 변수로 부모 생성자를 호출합니다.


2
답변 해 주셔서 감사합니다. 나는 그것이 그보다 더 우아하기를 바랐습니다.
Adam Moss

인수의 @Marius 순서는 부모 클래스 __construct 메소드 인수와 동일해야하며 사용자 정의 인수는 끝에 전달해야합니다.
chirag dodia

@chiragdodia 왜? 나는 그렇게 생각하지 않습니다. 지금까지 M2에서 빌드 한 모든 것은 임의로 추가 된 사용자 지정 구문 인수를 사용하여 빌드했습니다. 그리고 효과가있었습니다. 유일한 제약은 기본값을 가진 인수가 마지막에 가야한다는 것입니다.
Marius

@Marius 예 일부 경우에는 작동하지만 내 경우에는 \ Magento \ Catalog \ Block \ Product \ View가 작동하지 않을 때 부모 생성자와 동일한 순서로 인수를 만들고 마지막에 사용자 지정 인수를 추가해야합니다. 여기 내 코드를 살펴보십시오. magento.stackexchange.com/questions/95697/…
chirag dodia

내가 \ 젠토 \ 고객 \ 블록 \ 양식 \ 회원 가입 차단 무시하려고 할 때 그것은 나를 위해 작동하지 않습니다
딥 조쉬
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.