Answers:
我看到您提出了正确的解决方案,只是想总结一下。
构造函数注入应用于在您需要的任何类中检索帮助程序(或任何其他实例):
class SomeClass
{
public function __construct(\Magento\Core\Helper\Data $helper)
{
$this->helper = $helper;
}
public function doSmth()
{
$this->helper->someMethod();
}
}
请注意,不需要phpDoc注释,Magento将直接读取构造函数签名以找出需要哪些依赖项。
\ Magento \ Core \ Helper \ Factory仅在少数情况下应使用,当您不得不调用多个助手,或者您不知道到底需要哪个助手时。
严格禁止直接使用对象管理器。因此,请避免使用:
\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;
}
实例化助手的方式(至少对于新的Backend(〜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第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
?