Domanda

L'ultima build di Magento 2 hanno fatto fuori con la classe Mage. Questo vuol dire che abbiamo perso il metodo Mage::helper.

C'è una tecnica di sostituzione (fabbrica aiutante?) Per istanziare aiutanti in Magento 2? O stiamo aspettavamo di utilizzare la nuova classe dirigente Object, e basta istanziare l'assistente come / oggetto in cache Singleton con get (vs. create)

È stato utile?

Soluzione

vedo si è venuto a soluzione giusta, voglio solo da riassumere.

iniezione costruttore deve essere utilizzato per recuperare helper (o qualsiasi altro esempio) in qualsiasi classe è necessario:

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

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

Si noti che non sono necessari commenti PHPDoc , Magento leggerà firma costruttore direttamente per capire cosa sono necessari dipendenze.

\ Magento \ Core \ Helper \ fabbrica deve essere usato solo in quei rari casi in cui si deve chiamare un sacco di più aiutanti, o non si sa esattamente quale avete bisogno.

L'uso di Object Manager direttamente è rigorosamente scoraggiato . Quindi, si prega di evitare utilizzando:

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

E 'lì solo per la serializzazione / deserializzazione.

Altri suggerimenti

Sembra che Magento di incoraggiare la gente a usare la loro nuovo sistema di iniezione di dipendenza automatica per ottenere aiutanti e modelli in oggetti attraverso costruttore dell'oggetto.

La versione corta? Se si dispone di un oggetto che è un'istanza da parte del gestore oggetti, e decorare un costruttore con un PHPDoc @param , e i parametri ha un tipo corretto suggerimento set, il gestore oggetto verrà automaticamente istanziare l'helper (o, credo, altri oggetti) per voi.

Ad esempio, il seguente costruttore introdurrebbe un helper un nucleo dati nell'oggetto.

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

A parte tutte le risposte di cui sopra, se si deve utilizzare aiutante in phtml modello si può semplicemente fare in questo modo:

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

Spero che sia utile se qualcuno non lo sapeva prima;)

Il modo in cui aiutanti siano istanziati (almeno per il nuovo backend (~ modulo dev50)) sono tramite un helperFactory:

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

Che è essenzialmente solo un tipo specializzato di un modello di fabbrica. Per esempio: Magento \ Core \ Blocco \ Contesto la linea 143 (dev50) come parte del costruttore:

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

La fabbrica aiutante ritornerà il modello richiesto in base al nome della classe e garantire che si tratta di un instanceof l'helper classe astratta:

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

Se si dovesse implementare da soli sembra nucleo Magento sta caricando in uno dei due modi:

rotolare il proprio fabbrica:

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

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

O semplicemente prendere direttamente:

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

Prova questo modo

$helper = \Magento\Framework\App\ObjectManager::getInstance()->get('Xx\Xx\Helper\Xx');
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a magento.stackexchange
scroll top