Pregunta

Las últimas compilaciones de Magento 2 han eliminado el Mage clase. Esto significa que hemos perdido el Mage::helper método.

¿Existe una técnica de reemplazo (¿Fábrica de ayudantes?) Para instancias de ayudantes en Magento 2? O se espera que usemos la nueva clase de administrador de objetos, y simplemente instanciar el ayudante como un objeto singleton/en caché con get (vs. create)

¿Fue útil?

Solución

Veo que viniste a la solución correcta, solo quiero resumir.

La inyección de constructor debe usarse para recuperar a Helper (o cualquier otra instancia) en cualquier clase que necesite:

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

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

Darse cuenta de No se requieren comentarios de PHPDOC, Magento leerá la firma del constructor directamente para determinar qué dependencias se requieren.

Magento Core Helper Factory debe usarse solo en esos casos raros cuando tiene que llamar a muchos ayudantes múltiples, o no sabe exactamente cuál necesita.

El uso del administrador de objetos directamente es estrictamente desanimado. Así que por favor evite usar:

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

Está ahí solo para serialización/deserialización.

Otros consejos

Parece que la gente alentadora de Magento a usar su nueva inyección de dependencia automática Sistema para obtener ayudantes y modelos en objetos a través del constructor del objeto.

La versión corta? Si tiene un objeto instanciado por el administrador de objetos, y decorar un constructor con un PHPDOC @param, y Los parámetros tienen un conjunto de sugerencias de tipo adecuado, el administrador de objetos instanciará automáticamente el ayudante (o, creo, otros objetos) para usted.

Por ejemplo, el siguiente constructor inyectaría AA Core Data Helper en el objeto.

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

Además de todas las respuestas anteriores, si tiene que usar auxil en plantilla PhTML, simplemente puede hacer esto:

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

Espero que sea útil si alguien no lo sabía antes;)

La forma en que los ayudantes son instanciados (al menos para el nuevo módulo de backend (~ dev50)) son a través de una factory:

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

Que es esencialmente un tipo especializado de una fábrica de modelos. Por ejemplo: Magento Core Block Context Line 143 (Dev50) como parte del constructor:

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

La fábrica de ayudantes devolverá el modelo solicitado en función del nombre de la clase y se asegurará de que sea un instanceof La clase abstracta auxiliar:

/**
 * 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 tuviera que implementar esto usted mismo Parece que Magento Core lo está cargando de una de dos maneras:

Enrolle su propia fábrica:

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

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

O simplemente agarrarlo directamente:

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

Intenta de esta manera

$helper = \Magento\Framework\App\ObjectManager::getInstance()->get('Xx\Xx\Helper\Xx');
Licenciado bajo: CC-BY-SA con atribución
No afiliado a magento.stackexchange
scroll top