문제

Magento 2의 DI 시스템에 머리를 감쌌다고 생각하면 뭔가 떠오르며 풀립니다.
핵심 코드에서 도우미에 액세스하는 다양한 방법을 볼 수 있습니다.
예를 들어 Magento\Catalog\Controller\Category::_initCategory 이 있습니다:

if (!$this->_objectManager->get('Magento\Catalog\Helper\Category')->canShow($category)) {
    return false;
}

하지만 Magento\Catalog\Block\Category\View 도우미는 생성자에 주입됩니다.

public function __construct(
    \Magento\Framework\View\Element\Template\Context $context,
    \Magento\Catalog\Model\Layer\Category $catalogLayer,
    \Magento\Framework\Registry $registry,
    \Magento\Catalog\Helper\Category $categoryHelper,
    array $data = array()
) {
    $this->_categoryHelper = $categoryHelper;
    $this->_catalogLayer = $catalogLayer;
    $this->_coreRegistry = $registry;
    parent::__construct($context, $data);
}

이로 인해 컨트롤러와 블록(및 모델)에서 도우미에 다르게 액세스해야 한다고 생각하게 되었지만 도우미가 생성자에 주입되는 컨트롤러를 발견했습니다. Magento\Catalog\Controller\Adminhtml\Product\Action\Attribute.

안개를 걷어주세요.
언제 DI를 사용해야 하며 언제 사용해야 합니까? objectManager?그리고 왜?
나는 이 질문을 읽었습니다. Magento 2에서 도우미 인스턴스화.이것은 그에 대한 후속 질문입니다.

도움이 되었습니까?

해결책

가능한 경우, 물체 관리자를 사용하는 것처럼 이미 Deameter의 법칙에 대한 위반이 있습니다.오브젝트 관리자를 사용할 때 이러한 종속성은 메소드 논리에서 숨겨집니다.

다른 팁

나는 Magento 구현에 대해 잘 모르지만 다음과 같습니다. ObjectManager서비스 찾기.

일반적으로 서비스 로케이터를 사용하여 객체의 종속성에 액세스하는 것은 매우 나쁩니다. 체크아웃 이 기사.

생성자를 통해 종속성을 명시적으로 정의하는 것이 훨씬 더 나은 접근 방식입니다.정의되지 않은 서비스와 관련된 단위 테스트 및 런타임 문제를 지원합니다.

객체 관리자를 클래스에 주입하는 것은 기본적으로 모든 응용 프로그램 서비스에 액세스할 수 있는 클래스에 레지스트리를 주입하는 것인데 이는 분명히 옳지 않습니다.

나는 사용한다 ZF2 공정한 비트이며 일반적으로 서비스, 컨트롤러 및 종속성이 필요한 모든 클래스에 대한 작은 팩토리 클래스를 정의합니다.이러한 팩토리 클래스는 서비스 로케이터에 액세스하고 개체가 의존하는 모든 서비스를 가져와 생성자를 통해 주입합니다.Factory 클래스에서 서비스 로케이터를 사용하는 것은 대부분 코드를 버리기 때문에 괜찮습니다. 이것 예를 들어.

이 공장들은 여전히 ​​​​쉽습니다. 시험.

IMO, 가능한 경우 생성자 주입을 사용하십시오.다시 말하지만, 저는 Magento의 구현에 대해 잘 모릅니다. Factory 개념이 있다면 얼핏 보면 이를 지원하는 것처럼 보이지만 클래스를 명시적으로 정의하고 Service Locator를 사용하여 Factory 클래스에 구축하는 것은 훨씬 더 깨끗한 접근 방식입니다.

이것은 위에 언급된 패턴에 제한적으로 노출된 사람의 것이므로 이 문제에 대한 다른 사람의 생각/경험도 듣고 싶습니다!

더 읽어보기

도우미를 사용하는 또 다른 방법 (템플릿에서)은 다음과 같습니다.

$this->helper('[Vendor]\[Module]\Helper\[Helper Name]')->getMethodName();
.

당신이 이미 알지 못한 경우 유용하기를 바랍니다.

오래된 질문이지만, Marius 답변을 얻었는지 확실하지는 않습니다. 나는 marius 답변을 믿을 수 있습니다. 나는 그것을 짧게 대답하고 싶습니다. 왜 Magento 2는 도우미 대신 DI를 사용하도록 제안합니까?

  • 단위 테스트에서 격리 가능 / 쉬운
  • 클래스의 종속성을 명시 적으로 정의
  • 좋은 디자인을 촉진 (단일 책임 원리 (srp) 예)
  • 모듈에서 DI를 사용하면 비 호환성 버그 위험이 줄어든다. Magento는 해당 인터페이스의 기본 구현을 변경합니다. 이것은 확장 개발자를 이해하는 중요한 개념입니다.

    왜 어떤 경우에는 M2 코어가 DI를 사용할 수 없습니까?

    • 수업 수 감소
    • 불필요한 인터페이스를 생성하지 않음
    • 비 호환성 버그 위험

      코어 카탈로그 모듈이 헬퍼를 사용했지만 DI를 광범위하게 사용했습니다. 내 연구에서 Magento 2는 서비스 계약에 적합하지 않은 핵심 카탈로그 도우미 파일에서 몇 가지 기능을 사용했습니다.

      Magento 정의 클래스 (예 : \ Magento \ Catalog \ Model \ Product)를 명시 적으로 사용해야하는 경우 서비스 계약 인터페이스 대신 콘크리트 구현에 따라 암시 적 종속성을 명시 적으로 구성하십시오.

      의심 할 여지없이 확장 개발자는 도우미와 같은 Magento1 대신 DI를 사용해야합니다. Magento 2의 지침에 따라 구현할 때 낙진은 제한적입니다. 권장 사항을 깨뜨릴 때 문제가 발생합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 magento.stackexchange
scroll top