Вопрос

Последние сборки Magento 2 покончились с Mage учебный класс. Это означает, что мы потеряли Mage::helper метод

Существует ли техника замены (вспомогательная фабрика?) Для создания экземпляров помощников в Magento 2? Или мы должны использовать новый класс менеджера объектов и просто создать помощник в качестве объекта Singleton/Cached с get (против. 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), проходит через 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 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 с атрибуция
Не связан с magento.stackexchange
scroll top