Instantiating Helpers in Magento 2
-
16-10-2019 - |
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
)
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 , e i parametri ha un tipo corretto suggerimento set, il gestore oggetto verrà automaticamente istanziare l'helper (o, credo, altri oggetti) per voi. @param
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');