Frage

Die neuesten Builds von Magento 2 haben das beseitigt Mage Klasse. Dies bedeutet, dass wir das verloren haben Mage::helper Methode.

Gibt es eine Ersatztechnik (Helfer Factory?) Für die Instanziierung von Helfern in Magento 2? Oder werden wir von uns erwartet get (vs. create)

War es hilfreich?

Lösung

Ich sehe, Sie sind zur richtigen Lösung gekommen, möchten nur zusammenfassen.

Die Konstruktorinjektion sollte verwendet werden, um Helfer (oder eine andere Instanz) in jeder Klasse abzurufen, die Sie benötigen:

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

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

Beachte das Es sind keine phpdoc -Kommentare erforderlich, Magento liest die Konstruktorsignatur direkt, um herauszufinden, welche Abhängigkeiten erforderlich sind.

Magento core helfer fabrik sollte nur in diesen seltenen Fällen verwendet werden, wenn Sie viele mehrere Helfer anrufen müssen, oder Sie wissen nicht genau, welches Sie benötigen.

Die direkte Verwendung von Objektmanager ist direkt streng entmutigt. Bitte vermeiden Sie es mit der Verwendung:

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

Es gibt nur zur Serialisierung/Deserialisierung.

Andere Tipps

Es sieht aus wie Magentos ermutigende Leute, ihre zu benutzen Neue automatische Abhängigkeitsinjektion System, um Helfer und Modelle über den Konstruktor des Objekts in Objekte zu bringen.

Die Kurzversion? Wenn Sie ein Objekt haben, das vom Objektmanager instanziiert wird, und Dekorieren Sie einen Konstruktor mit einem PHPDOC @param, und Die Parameter haben einen ordnungsgemäßen Typ -Hinweissatz, der Objektmanager wird den Helfer (oder, wie ich glaube, andere Objekte) automatisch für Sie instanziiert.

Beispielsweise würde der folgende Konstruktor einen AA -Kerndatenhelfer in das Objekt einfügen.

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

Abgesehen von allen oben genannten Antworten können Sie dies einfach mögen, wenn Sie Helfer in der PHTML -Vorlage verwenden müssen:

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

Ich hoffe es ist hilfreich, wenn jemand es vorher nicht wusste;)

Die Art und Weise, wie Helfer instanziiert werden (zumindest für das neue Backend (~ Dev50) -Modul), erfolgt über ein HelperFactory:

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

Dies ist im Wesentlichen nur ein spezialisierter Typ einer Modellfabrik. EG: Magento Core Block Context Line 143 (Dev50) als Teil des Konstruktors:

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

Die Helferfabrik gibt das angeforderte Modell basierend auf dem Klassennamen zurück und sorgt dafür, dass es ein ist instanceof Die helfer abstrakte Klasse:

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

Wenn Sie dies selbst implementieren würden Es scheint, dass Magento Core es auf zwei Arten lädt:

Rollen Sie Ihre eigene Fabrik:

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

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

Oder schnappen Sie es sich einfach direkt:

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

Versuchen Sie es so

$helper = \Magento\Framework\App\ObjectManager::getInstance()->get('Xx\Xx\Helper\Xx');
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit magento.stackexchange
scroll top