O que é ajudante no Magento?
Em que casos se deve usar e não usar ajudantes?
O que é ajudante no Magento?
Em que casos se deve usar e não usar ajudantes?
Respostas:
Teoricamente, você nunca deve usar ajudantes.
Os ajudantes são apenas coleções de métodos não relacionados e sempre são instanciados como singletons.
Isso é basicamente programação procedural com funções agrupadas em algum espaço para nome (o nome da classe neste caso). Mas como o Magento tem auxiliares no núcleo, você pode colocar seus métodos lá, que você não tem idéia de onde colocá-los ou se precisar chamá-los em vários lugares diferentes (modelos, controladores, modelos)
Use-os como último recurso.
Além disso, o Magento requer um auxiliar para cada módulo por motivos de tradução.
Você pode simplesmente criar um auxiliar chamado Data.php
em cada módulo e deixá-lo vazio.
A questão tem dois aspectos:
Em geral, tendo aulas com o nome Helper
, Util
ou similar apenas diz "eu tenho algumas funções que eu não sei onde colocar" e não faz muito sentido como uma classe.
O Magento instancia os auxiliares como singletons e a maioria dos auxiliares principais não tem nenhum estado, portanto os métodos também podem ser static
ou mesmo functions
sem uma classe. Tudo isso costuma ser considerado um cheiro de código , uma falha no design do aplicativo.
Como Marius já apontou, você não precisa usar ajudantes para seu próprio código. Basta criar um auxiliar vazio padrão por módulo se você usar traduções específicas do módulo, caso contrário elas não funcionarão. Prefira modelos (que não precisam ser estendidos Mage_Core_Model_Abstract
se não representam dados do banco de dados) ou classes de bibliotecas independentes.
No entanto, eu não seria muito rigoroso sobre "não usar ajudantes" e, em vez disso, os usaria para atalhos de consulta como:
configuração do módulo de acesso:
public function getFooBar()
{
return Mage::getStoreConfig('module/foo/bar');
}
métodos de fábrica para classes de biblioteca
public function getNewFooService()
{
return new \Foo\Service(...);
}
Você pode encontrar outros lugares, mas IMHO, o auxiliar de módulo geralmente é bom o suficiente para coisas assim.
Consumir os ajudantes principais é algo que você fará com bastante frequência.
__()
método de tradução: para obter uma tradução de um módulo específico, você deve usar Mage::helper('module-alias')->__('string to be translated')
. Isso acontece implicitamente se você usa $this->__(...)
dentro de um modelo ou bloco e se usa o translate="..."
atributo em arquivos XMLMage::helper('core')
métodos: data localizada, formatação de preço e moeda, dados de escape e codificaçãoMage::helper('tax')
métodos para obter informações da configuração do imposto e calcular preços com base nesseMage::helper('catalog/image')
fornece uma interface para criar imagens de catálogo redimensionadas e em cache e recuperar seu URLMage::helper('catalog/product_url_rewrite')->joinTableToSelect()
une a tabela de reescrita do URL a uma consulta de coleção de produtos.Existem muitas funções úteis (mais ou menos) ocultas nos auxiliares principais, se você precisar de uma funcionalidade específica que provavelmente será usada no núcleo em algum lugar, verifique se pode reutilizar um método auxiliar.
Geralmente esses auxiliares são objetos sem estado e os métodos são métodos de consulta (ou seja, eles não têm efeitos colaterais)
Mas, como sempre, o Magento quebra suas próprias regras não escritas e não deve ser tomado como exemplo. Um exemplo "bom" de como não usar ajudantes é o Mage_Catalog_Helper_Product_Compare
que possui uma $_itemCollection
propriedade que só pode ser inicializada uma vez e uma $_customerId
propriedade que pode ser alterada com um setter. Você encontrará mais alguns ajudantes relacionados ao catálogo com coleções anexas. Escrever testes para código que os utiliza ou reutilizá-los em diferentes contextos não é divertido, portanto, não faça isso em casa.
O catalog/image
auxiliar mencionado acima é outro exemplo de um auxiliar que realmente não deve ser um auxiliar. Você precisa passar um produto init()
primeiro, que redefine seu estado atual, depois define vários parâmetros (como resize()
, setQuality()
) e, no final, pode obter a URL com seu __toString()
método. Parece bom quando usado em um modelo, mas o código é uma grande bagunça e não faz sentido como um singleton.
TL; DR:
Reader
e Writer
modelos, que realmente fazer tem estado (pelo menos um recurso de arquivo). Por exemplo, para ler dados de status de pedidos de um arquivo CSV, eu teria sth. como um OrderStatusCsvReader
modelo usado por um OrderStatusUpdater
modelo. Desta forma, eu também separar as preocupações "ler dados de arquivo" e "fim atualização no Magento"
Marius está certo. Eu acho que ajudantes não fazem sentido.
Mas, na teoria do magento, você deve colocar tudo em auxiliares que não alterem o estado de um objeto, por exemplo, obter preços formatados.
Mas tudo o que você pode colocar em um ajudante, você também pode colocar em um modelo. E você pode obter diferentes instâncias de um modelo, o que é útil para testes.
Eu sou bastante novo no Magento, mas para mim parece que um Helper é equivalente a um serviço do Magento : "um conjunto de funcionalidades de software relacionadas que podem ser reutilizadas para diferentes fins". Um módulo exporta sua funcionalidade oferecida por meio de serviços. Use um auxiliar para as funções que você convida outros módulos a usar.
Um modelo deve fornecer apenas métodos diretamente relacionados à obtenção ou configuração do estado de um objeto ou, de outra forma, vinculados ao objeto instanciado do modelo.
As ajudas são úteis para evitar códigos duplicados (em modelos, modelos, ...) e, às vezes, são apenas necessários.
Mage::getStoreConfigFlag('my/module/enabled')
em todos os arquivos em que deseja verificar isso ou usar Mage::helper('my_module')->isEnabled()
com os benefícios:
isEnabled()
método helpers e isso afetará todas as classes que o usam, em vez de reescrever vários arquivosMage_Catalog_Model_Product
para adicionar o método getProductArticles()
. Certo . No seu ajudante, adicionegetProductArticles(Mage_Catalog_Model_Product $product)
<action method="someMethod"><var helper="module/method" /></action>
Você pode simplesmente criar um auxiliar chamado
Data.php
em cada módulo e deixá-lo vazio .
Ao usar o PHPUnit, você deve adicionar uma única linha :protected $_moduleName = 'My_Module';
foreach
loops e todo tipo de loucura. Achei refatorar essa lógica aterradora para um ajudante e usá-la como um cache de objeto para ser útil, e deixei pouco espaço para erros de futuros desenvolvedores que podem ter chamado acidentalmente emgetModel
vez degetSingleton
se eu a tivesse colocado em um modelo.