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.