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');
许可以下: CC-BY-SA归因
scroll top