Magento 2에서 헬퍼 인스턴스화


26

Magento 2의 최신 빌드가 Mage수업에서 사라졌습니다 . 이것은 우리가 Mage::helper방법을 잃어버린 것을 의미합니다 .

Magento 2에서 헬퍼를 인스턴스화하기위한 대체 기술 (헬퍼 팩토리?)이 있습니까? 또는 새로운 Object Manager 클래스를 사용하고 get(vs. create) 를 사용하여 도우미를 싱글 톤 / 캐시 된 객체로 인스턴스화해야합니다.

답변:


31

나는 당신이 올바른 해결책을 찾은 것을 보았습니다. 단지 요약하고 싶습니다.

생성자 주입은 필요한 클래스에서 도우미 (또는 다른 인스턴스)를 검색하는 데 사용해야합니다.

class SomeClass
{
    public function __construct(\Magento\Core\Helper\Data $helper)
    {
        $this->helper = $helper;
    }

    public function doSmth()
    {
        $this->helper->someMethod();
    }
}

공지 사항 것을 더하는 PHPDoc 의견이 필요하지 않습니다 , 마 젠토는 의존성이 필요한지 알아 내기 위해 직접 생성자 서명을 읽습니다.

\ Magento \ Core \ Helper \ Factory는 다수의 헬퍼를 호출해야하거나 필요한 헬프를 정확히 모르는 드문 경우에만 사용해야합니다.

Object Manager의 직접 사용은 엄격히 권장하지 않습니다 . 따라서 다음을 사용하지 마십시오.

\Magento\Core\Model\ObjectManager::getInstance()

직렬화 / 직렬화 해제 전용입니다.


PHP 단위로 테스트 할 수 없으므로 정적을 사용하지 마십시오. 그렇습니다. 모든 M2 종속성은 생성자를 통해 수행되며 내부적으로 오브젝트 관리자에 의해 관리되며 싱글 톤으로 검색합니다. 또한 속성 가시성을 나타 내기 위해 _를 사용하지 마십시오. 모든 M2 이름 지정은 camecase를 사용해야합니다
— PartySoft

@Anton Kril helper템플릿 $this->helper('Magento\Catalog\Helper\Image')과 같이 사용하면 모범 사례를 따릅니다.
— Khoa TruongDinh

2
아니 그렇지 않아. 템플릿은 블록 만 참조해야합니다. 도우미는 피해야합니다
— Anton Kril

10

Magento의 사람들은 새로운 자동 종속성 주입 시스템을 사용하여 객체의 생성자를 통해 도우미와 모델을 객체로 가져 오는 것으로 보입니다 .

짧은 버전? 당신은 개체 관리자에 의해 인스턴스화 된 객체를 가지고있는 경우 와 하는 PHPDoc와 생성자를 장식@param , 그리고 매개 변수가 올바른 유형의 힌트 세트가, 개체 관리자가 자동으로 당신을 위해 (나는 다른 객체를 믿고, 또는) 도우미를 인스턴스화합니다.

예를 들어, 다음 생성자는 객체에 핵심 데이터 도우미를 주입합니다.

/**
* @param \Magento\Core\Helper\Data $coreData
*/        
public function __construct(\Magento\Core\Helper\Data $coreData)
{
    $this->_coreHelper = $coreData;            
}

이것이 정답입니다. 많은 파기 후에도 나에게 완전히 분명하지 않았습니다.
— philwinkle

2
오케이 ... 이제 머리가 아프다 ... 많이. PHPDoc을 사용하여 코드를 "작성"해야한다는 뜻입니까? 이건 광기 야 나는 종료했다.
— Marius

@Marius hahaha 이것은 드문 일이 아닙니다-Alan의 블로그가 어느 정도 설명합니다.
— philwinkle

3
@ 필 윈클. 나는 그의 기사를 읽었다. 매우 흥미롭지 만 여전히 이것이 광기라고 말합니다. 구식이라고 불러라. 그러나 "내 시대로 돌아가는"코드는 코드 였고 주석은 거의 아무도 작성하지 않아도되는 것들이었다.
— Marius

아 .. 그런데. +1. 좋은 질문과 좋은 답변.
— Marius

7

위의 모든 답변 외에도 phtml 템플릿에서 도우미를 사용해야하는 경우 간단히 다음과 같이 할 수 있습니다.

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

누군가 전에 그것을 모르면 도움이되기를 바랍니다.)


6

헬퍼가 인스턴스화되는 방법 (적어도 새로운 백엔드 (~ dev50) 모듈의 경우)은 helperFactory를 통해 이루어집니다.

/**
 * Return helper object
 *
 * @param string $name
 * @return \Magento\Core\Helper\AbstractHelper
 */
public function helper($name)
{
    return $this->_helperFactory->get($name);
}

본질적으로 모델 팩토리의 특수한 유형입니다. 예 : 생성자의 일부인 Magento \ Core \ Block \ Context line 143 (dev50) :

\Magento\Core\Model\Factory\Helper $helperFactory

헬퍼 팩토리는 클래스 이름을 기반으로 요청 된 모델을 리턴 instanceof하고 헬퍼 추상 클래스 인지 확인합니다 .

/**
 * Get helper singleton
 *
 * @param string $className
 * @param array $arguments
 * @return \Magento\Core\Helper\AbstractHelper
 * @throws \LogicException
 */
public function get($className, array $arguments = array())
{
    $className = str_replace('_', '\\', $className);
    /* Default helper class for a module */
    if (strpos($className, '\Helper\\') === false) {
        $className .= '\Helper\Data';
    }

    $helper = $this->_objectManager->get($className, $arguments);

    if (false === ($helper instanceof \Magento\Core\Helper\AbstractHelper)) {
        throw new \LogicException(
            $className . ' doesn\'t extends Magento\App\Helper'
        );
    }

    return $helper;
}

이것을 직접 구현하려면 Magento 코어가 두 가지 방법 중 하나로로드하는 것 같습니다.

자신의 공장을 롤 :

$objectManager = \Magento\Core\Model\ObjectManager::getInstance();

$helperFactory = $objectManager->get('\Magento\Core\Model\Factory\Helper');
$helper = $helperFactory->get('\PulseStorm\Commercebug\Helper\Data');

아니면 그냥 직접 잡아 :

$helper = \Magento\Core\Model\ObjectManager::getInstance()->get('Magento\Core\Helper\Data');

1
유용한 정보는 +1이지만 팩토리를 직접 인스턴스화하고 싶습니까? 또는 get? 를 사용하여 캐시 된 클래스로 Object Manager에서 단일 헬퍼 팩토리를 인스턴스화해야 합니까?
— Alan Storm

헬퍼 팩토리는 \ Mage \ Core \ Block \ Abstract에서 상속 받았기 때문에 완전히 명확하지 않습니다. 의도는 자신의 헬퍼 팩토리를 제공하는 것입니다. 그러나 의도적으로 공장의 싱글 톤을 만드는 것처럼 보이지 않습니다 .
— philwinkle

내가 필요로하는 것 / 최상의 소스는 _helperFactory가 해당 객체에 어떻게 주입되는지 추적하고 핵심 팀이 어떻게 그것을 인스턴스화하는지 확인하는 것입니다.
— Alan Storm

내 단순화 요약이 올바르지 않으며 생성자에 ObjectManager 인스턴스가 필요합니다. 잠시 편집하겠습니다.
— philwinkle

편집을 참조하십시오. cli shell 환경에서 저장소 구성 인스턴스가 예상대로로드되지 않기 때문에 현재 결정하기가 어렵습니다. 그러나 이것은 당신을 올바른 길로 인도하기에 충분해야합니다.
— philwinkle

0

이 방법으로 시도

$helper = \Magento\Framework\App\ObjectManager::getInstance()->get('Xx\Xx\Helper\Xx');

Object Manager의 직접 사용은 엄격히 권장하지 않습니다.
— sv3n

@ sv3n 설명해 주시겠습니까? 이유가 무엇입니까?. 감사.
— Thushan

1
더 나은 의존성 주입을 대신 사용하십시오 ... 예를 들어 여기에서 대답했습니다 ... magento.stackexchange.com/questions/142352/…
— sv3n
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.