¿Qué es ayudante en Magento?

Respuestas:

27

Teóricamente nunca deberías usar ayudantes.
Los ayudantes son solo colecciones de métodos no relacionados y siempre se crean instancias como singletons.
Esto es básicamente una programación procesal con funciones agrupadas bajo algún espacio de nombres (el nombre de la clase en este caso). Pero dado que Magento tiene ayudantes en el núcleo, puede poner sus métodos allí para que no tenga idea de dónde colocarlos o si necesita llamarlos en muchos lugares diferentes (modelos, controladores, plantillas)

Úsalos como último recurso.

También Magento requiere un ayudante para cada módulo por razones de traducción.
Simplemente puede crear un asistente llamado Data.phpen cada módulo y dejarlo vacío.

Marius
fuente
El único "uso" real que he encontrado para los ayudantes es que están garantizados para ser siempre solteros. He trabajado en un código educativo heredado que cargaba colecciones dentro de foreachbucles y todo tipo de locuras. Me pareció útil refactorizar esta lógica aterradora a un ayudante y usarla como caché de objetos, y dejé poco espacio para errores de futuros desarrolladores que podrían haber llamado accidentalmente en getModellugar de getSingletonsi lo hubiera colocado en un modelo.
Luke Rodgers
@LukeRodgers. Veo su punto, pero no creo que "pueda haber llamado accidentalmente a getModel en lugar de getSingleton" califica como una razón real para usar ayudantes. Puedo argumentar que puede "accidentalmente" llamar a "eliminar" en lugar de "guardar". ¿Qué protección puedes hacer para evitar esto? Supongo que "prestar atención" es parte del desarrollo de software.
Marius
Convenido. En estos escenarios, supongo que solo estoy tratando de codificar defensivamente contra la humanidad.
Luke Rodgers
¿Cómo haría para agregar métodos personalizados a los ayudantes principales?
tecjam
13

La pregunta tiene dos aspectos:

  1. ¿Debo escribir mis propios ayudantes y para qué?
  2. ¿Debo usar los ayudantes principales y para qué?

1. Ayudantes de escritura

En general, tener clases nombradas Helper,Util o similar, simplemente dice "tengo algunas funciones que no sé dónde poner" y no tienen mucho sentido como una clase.

Magento crea instancias de ayudantes como singletons y la mayoría de los ayudantes principales no tienen ningún estado, por lo que los métodos podrían ser statico incluso functionssin una clase. Todo esto a menudo se considera un olor a código. , una falla en el diseño de la aplicación.

Como Marius ya señaló, no necesita usar ayudantes para su propio código. Simplemente cree un ayudante vacío predeterminado por módulo si usa traducciones específicas del módulo, de lo contrario no funcionarán. Prefiere modelos (que no necesitan extenderseMage_Core_Model_Abstract si no representan datos de la base de datos) o clases de biblioteca independientes.

Sin embargo, no sería demasiado estricto sobre "no usar ayudantes en absoluto" y en su lugar los usaré para accesos directos a consultas como:

  • configuración del módulo de acceso:

    public function getFooBar() 
    {
        return Mage::getStoreConfig('module/foo/bar');
    }
  • métodos de fábrica para clases de biblioteca

    public function getNewFooService()
    {
        return new \Foo\Service(...);
    }

Podría encontrar otros lugares, pero en mi humilde opinión, el módulo de ayuda a menudo es lo suficientemente bueno para cosas como esa.


2. Usando ayudantes

Consumir los principales ayudantes es algo que harás con bastante frecuencia.

Ejemplos:

  • __()método de traducción: para obtener una traducción de un módulo específico, debe usar Mage::helper('module-alias')->__('string to be translated'). Esto sucede implícitamente si usa $this->__(...)dentro de una plantilla o bloque y si usa el translate="..."atributo en archivos XML
  • Mage::helper('core') métodos: fecha localizada, formateo de precios y monedas, datos de escape y codificación
  • Mage::helper('tax') métodos para obtener información de la configuración de impuestos y calcular precios basados ​​en eso
  • Mage::helper('catalog/image') proporciona una interfaz para crear imágenes de catálogo en caché y redimensionadas y recuperar su URL
  • Mage::helper('catalog/product_url_rewrite')->joinTableToSelect() une la tabla de reescritura de URL a una consulta de colección de productos.

Hay muchas más (más o menos) funciones útiles ocultas en los ayudantes principales, si necesita una funcionalidad específica que pueda usarse en algún lugar del núcleo, verifique si puede reutilizar un método auxiliar.

Generalmente estos ayudantes son objetos sin estado y los métodos son métodos de consulta (es decir, no tienen efectos secundarios)

Pero, como siempre, Magento rompe sus propias reglas no escritas y no debe tomarse como ejemplo. Un "buen" ejemplo de cómo no usar ayudantes es Mage_Catalog_Helper_Product_Compareque tiene una $_itemCollectionpropiedad que solo se puede inicializar una vez y una $_customerIdpropiedad que se puede cambiar con un setter. Encontrará algunos ayudantes más relacionados con el catálogo con colecciones adjuntas. Escribir pruebas para el código que las usa o reutilizarlas en un contexto diferente no es divertido, así que no lo haga en casa.

El catalog/imageayudante mencionado anteriormente es otro ejemplo de un ayudante que realmente no debería ser un ayudante. init()Primero debe pasar un producto que restablezca su estado actual, luego establezca varios parámetros (como resize(), setQuality()) y al final puede obtener la URL con su __toString()método. Eso se ve bien cuando se usa en una plantilla, pero el código es un gran desastre y no tiene sentido como un singleton.


TL; DR:

  • Los ayudantes principales contienen herramientas útiles.
  • Necesitas ayudantes para la traducción.
  • Los ayudantes deben ser apátridas
  • En sus propios módulos, evite usar ayudantes como colecciones de funciones variadas. En la mayoría de los casos, puede encontrar un lugar más apropiado
Fabian Schmengler
fuente
A menudo he usado ayudantes en integraciones simples de ERP basadas en archivos planos. Todo lo que hacen es escribir y leer archivos de directorios locales y actualizar otros objetos (producto, pedido, etc.). No tienen estados o tablas correspondientes propias en las instancias mencionadas. ¿Cuál es su opinión sobre esto?
musicliftsme
1
Eso viola "sin efectos secundarios". Mi opinión habitual en la lectura y escritura de archivos son Readery Writermodelos, que realmente hacer que el estado (por lo menos un recurso de archivo). Por ejemplo, para leer los datos del estado del pedido de un archivo CSV, tendría algo. lika un OrderStatusCsvReadermodelo que es usado por un OrderStatusUpdatermodelo. De esta manera también separo las preocupaciones "leer datos del archivo" y "orden de actualización en Magento"
Fabian Schmengler
4

Marius tiene razón. Creo que los ayudantes no tienen sentido.

Pero en la teoría de magento, debe poner todo en ayudantes que no cambie el estado de un objeto, por ejemplo, obtener un precio formateado.

Pero todo lo que puede poner en un ayudante, también puede ponerlo en un modelo. Y puede obtener diferentes instancias de un modelo, lo que es útil para las pruebas.

Fabian Blechschmidt
fuente
2

Soy bastante nuevo en Magento, pero para mí parece que Helper es el equivalente de un servicio de Magento : "un conjunto de funcionalidades de software relacionadas que pueden reutilizarse para diferentes propósitos". Un módulo exporta su funcionalidad ofrecida a través de los servicios. Use un ayudante para las funciones que invita a otros módulos a usar.

Un modelo solo debe proporcionar métodos que estén directamente relacionados con la obtención o el establecimiento del estado de un objeto, o que de otro modo estén vinculados al objeto instanciado del modelo.

Patrick van Bergen
fuente
1

Las ayudas son útiles para evitar el código duplicado (en modelos, plantillas, ...) y algunas veces son solo necesarias.

  • para verificar si su módulo personalizado está habilitado, puede colocar algo como Mage::getStoreConfigFlag('my/module/enabled')cada archivo donde desee verificar esto, o puede usarlo Mage::helper('my_module')->isEnabled()con beneficios:
    • si, por ejemplo, la ruta de configuración cambia por alguna razón, solo tiene que ajustar un archivo
    • puede reescribir el isEnabled()método de ayuda y afectará a todas las clases que lo usan, en lugar de reescribir varios archivos
  • 13th @ ¿Cómo escribir una extensión personalizada? : No reescriba las clases a menos que sea necesario. Use observadores y si no es posible usar métodos auxiliares que reciban como parámetro e instancia de una clase que desea anular. Incorrecto: anular Mage_Catalog_Model_Productpara agregar el método getProductArticles(). Derecho . En su ayudante agreguegetProductArticles(Mage_Catalog_Model_Product $product)
  • hacer que las actualizaciones de diseño sean más flexibles usando <action method="someMethod"><var helper="module/method" /></action>

Simplemente puede crear un asistente llamado Data.phpen cada módulo y dejarlo vacío .

Cuando use PHPUnit, debe agregar una sola línea :protected $_moduleName = 'My_Module';

sv3n
fuente