답변:
나는 당신이 올바른 해결책을 찾은 것을 보았습니다. 단지 요약하고 싶습니다.
생성자 주입은 필요한 클래스에서 도우미 (또는 다른 인스턴스)를 검색하는 데 사용해야합니다.
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()
직렬화 / 직렬화 해제 전용입니다.
helper
템플릿 $this->helper('Magento\Catalog\Helper\Image')
과 같이 사용하면 모범 사례를 따릅니다.
Magento의 사람들은 새로운 자동 종속성 주입 시스템을 사용하여 객체의 생성자를 통해 도우미와 모델을 객체로 가져 오는 것으로 보입니다 .
짧은 버전? 당신은 개체 관리자에 의해 인스턴스화 된 객체를 가지고있는 경우 와 하는 PHPDoc와 생성자를 장식 , 그리고 매개 변수가 올바른 유형의 힌트 세트가, 개체 관리자가 자동으로 당신을 위해 (나는 다른 객체를 믿고, 또는) 도우미를 인스턴스화합니다.@param
예를 들어, 다음 생성자는 객체에 핵심 데이터 도우미를 주입합니다.
/**
* @param \Magento\Core\Helper\Data $coreData
*/
public function __construct(\Magento\Core\Helper\Data $coreData)
{
$this->_coreHelper = $coreData;
}
헬퍼가 인스턴스화되는 방법 (적어도 새로운 백엔드 (~ 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');
get
? 를 사용하여 캐시 된 클래스로 Object Manager에서 단일 헬퍼 팩토리를 인스턴스화해야 합니까?