Question

Le dernier construit de Magento 2 ont fait disparaître la classe Mage. Cela signifie que nous avons perdu la méthode Mage::helper.

Y at-il une technique de remplacement (usine d'aide?) Pour les aides instanciation dans Magento 2? Ou sommes-nous nous attendions à utiliser la nouvelle classe de gestionnaire d'objets, et juste instancier l'aide comme un objet singleton / cache avec get (par rapport à create)

Était-ce utile?

La solution

Je vois que vous est venu à la solution juste, je veux juste résumer.

injection Constructor doit être utilisé pour récupérer aide (ou toute autre instance) quelle que soit la classe dont vous avez besoin:

class SomeClass
{
    public function __construct(\Magento\Core\Helper\Data $helper)
    {
        $this->helper = $helper;
    }

    public function doSmth()
    {
        $this->helper->someMethod();
    }
}

Notez que aucun commentaire phpdoc sont nécessaires , Magento va lire la signature du constructeur directement à comprendre ce que les dépendances sont nécessaires.

\ Magento \ Core \ Aide \ usine devrait être utilisé que dans les rares cas où vous devez appeler beaucoup de multiples aides, ou vous ne savez pas exactement celui que vous avez besoin.

Utilisation du gestionnaire d'objets est directement strictement découragé . Donc, évitez de l'aide:

\Magento\Core\Model\ObjectManager::getInstance()

Il est là que pour la sérialisation / désérialisation.

Autres conseils

Il ressemble à encourager les gens de Magento à utiliser leur nouveau système d'injection de dépendance automatique pour obtenir des aides et des modèles en objets via le constructeur de l'objet.

La version courte? Si vous avez un objet qui est instancié par le gestionnaire d'objets, et décorez un constructeur avec un PHPDoc @param , et les paramètres a un indice de type approprié ensemble, le gestionnaire d'objets automatiquement instancier l'aide (ou, je crois, d'autres objets) pour vous.

Par exemple, le constructeur suivant pourrait injecter un une aide de données de base dans l'objet.

/**
* @param \Magento\Core\Helper\Data $coreData
*/        
public function __construct(\Magento\Core\Helper\Data $coreData)
{
    $this->_coreHelper = $coreData;            
}

En dehors de toutes les réponses ci-dessus, si vous devez utiliser aide dans phtml modèle que vous pouvez simplement faire comme ceci:

$this->helper('[Vendor]\[Module]\Helper\[Helper Name]');

Je l'espère, il est utile si quelqu'un ne savait pas avant;)

La façon dont les aides sont instanciés (au moins pour le nouveau backend (~ module de dev50)) sont via un helperFactory:

/**
 * Return helper object
 *
 * @param string $name
 * @return \Magento\Core\Helper\AbstractHelper
 */
public function helper($name)
{
    return $this->_helperFactory->get($name);
}

Ce qui est essentiellement juste un type spécialisé d'une usine modèle. Par exemple: Magento \ Core \ bloc \ ligne de contexte 143 (de dev50) dans le cadre du constructeur:

\Magento\Core\Model\Factory\Helper $helperFactory

L'usine d'aide renverra le modèle demandé en fonction du nom de classe et faire en sorte que c'est un instanceof l'assistant classe abstraite:

/**
 * 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;
}

Si vous deviez mettre en œuvre vous-même il semble noyau Magento est de le charger dans l'une des deux façons:

Réaliser votre propre usine:

$objectManager = \Magento\Core\Model\ObjectManager::getInstance();

$helperFactory = $objectManager->get('\Magento\Core\Model\Factory\Helper');
$helper = $helperFactory->get('\PulseStorm\Commercebug\Helper\Data');

Ou tout simplement saisir directement:

$helper = \Magento\Core\Model\ObjectManager::getInstance()->get('Magento\Core\Helper\Data');

Essayez de cette façon

$helper = \Magento\Framework\App\ObjectManager::getInstance()->get('Xx\Xx\Helper\Xx');
Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top