在Magento 2中实例化帮助者
-
16-10-2019 - |
题
Magento 2的最新版本已经消失了 Mage
班级。这意味着我们已经失去了 Mage::helper
方法。
是否有用于在Magento 2中实例化助手的替代技术(辅助工厂?)?还是我们期望使用新的对象管理器类,只将助手作为单身/缓存的对象实例化 get
(VS。 create
)
解决方案
我看到您提出了正确的解决方案,只是想总结一下。
构造函数注入应用于在所需的任何类中检索助手(或任何其他实例):
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()
它仅用于序列化/避难所。
其他提示
看起来Magento鼓励人们使用他们的 新的自动依赖注射 通过对象的构造函数将帮助者和模型吸引到对象中的系统。
简短版本?如果您的对象是由对象管理器实例化的,则 和 用phpdoc装饰构造函数 , 和 该参数具有正确的类型提示集,对象管理器将为您自动实例化助手(或我相信其他对象)。 @param
例如,以下构造函数会将AA核心数据助手注入对象。
/**
* @param \Magento\Core\Helper\Data $coreData
*/
public function __construct(\Magento\Core\Helper\Data $coreData)
{
$this->_coreHelper = $coreData;
}
除上述所有答案外,如果您必须在PHTML模板中使用助手,您可以简单地喜欢这样做:
$this->helper('[Vendor]\[Module]\Helper\[Helper Name]');
我希望如果有人以前不知道它会有所帮助;)
实例化助手的方式(至少对于新的后端(〜dev50)模块)是通过助攻性的:
/**
* 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 Core以两种方式之一加载它:
滚动自己的工厂:
$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');
尝试这种方式
$helper = \Magento\Framework\App\ObjectManager::getInstance()->get('Xx\Xx\Helper\Xx');