Magento 2: uso adecuado de ayudantes

9

Estoy empezando a ver a más y más personas declarando clases de ayuda para poder usar lo siguiente en los archivos de plantilla:

$this->helper('Path/To/Helper/Class')->customMethod();

Este tipo de código permite a las personas evitar la restricción de no usar directamente el administrador de objetos, pero tiendo a ver código que debería ser código de bloqueo en esos ayudantes.

Asi que aqui están mis preguntas:

  • ¿Qué debería uno escribir en las clases auxiliares?
  • ¿En qué casos es relevante utilizar métodos auxiliares en las plantillas?
Raphael en Digital Pianism
fuente

Respuestas:

20

No lo hagas
¡Esto es como usar ObjectManager::getInstance()->create()una plantilla!
Utilice un Bloque personalizado que reciba el ayudante como una dependencia del constructor y agregue un método proxy que llame al método auxiliar.

En la plantilla:

$block->customMethod()

En el bloque:

public function __construct(Path/To/Helper/Class $helperClass, ...other dependencies...)
{
    $this->helper = $helperClass;
    // ...other assignments and call to parent::__construct()
}

public function customMethod()
{
    return $this->helper->customMethod();
}

En el principio de OOP, esto evita violar la "Ley de Demeter". Encapsula la lógica de negocios en el bloque en lugar de la plantilla. Como efecto secundario, también hace que la lógica sea más comprobable a medida que la lógica se mueve al bloque.

Con respecto a la lógica puesta en las clases de ayuda, encuentro que en Magento 2 los ayudantes tienen más sentido para los servicios, como algo que no es un modelo, pero contiene código reutilizable, por ejemplo, el formato de precios (que está contenido en el núcleo, pero puedo No piense en un mejor ejemplo en este momento).

Vinaí
fuente
Estoy de acuerdo con el principio, sin embargo, parece que usando preferencia en el di.xmltipo de clase de bloques, no guardo alguna configuración de diseño. Intenté, por ejemplo, hacerlo para la clase \Magento\Catalog\Block\Product\View\Type\Simple, la plantilla default.phtmlque se utilizó en nuestra plantilla se ignora. No tengo idea de por qué en este momento
Sylvain Rayé
2
Entrando aquí para obtener más información actualizada. A partir de 2.2, no se recomienda extender las clases de bloque. En cambio, si se requiere una lógica de presentación personalizada, se debe definir un ViewModel y declararlo como un argumento para el Bloque en layout.xml. Dado que los ViewModels se crean a través del Administrador de objetos, puede conectar su propio gráfico de dependencia sin exponerse a cambios de BC en futuras versiones de Magento 2.
John Hall
1

Veo a los ayudantes como funciones globales dentro de su módulo (perdón por la palabra 'global'), y los gerentes / contratos de servicio como funciones globales que se pueden usar tanto dentro como fuera de su módulo.

Si sigues este principio, verás que hay un uso mínimo para los ayudantes, solo los uso como un contenedor de configuración en mis módulos.

$this->configHelper->get(Config::PATH_TO_XML_PATH);
$this->configHelper->isEnabled();

Este tipo de cosas Si tiene alguna otra funcionalidad que pueda ser práctica fuera de su módulo, cree un administrador en su lugar.

En un mundo ideal, los desarrolladores de terceros que necesitan la funcionalidad de otros módulos solo deberían tener que buscar en las interfaces disponibles repositorios y administradores y otras cosas en la Apicarpeta.

Giel Berkers
fuente