O que é ajudante no Magento?

22

O que é ajudante no Magento?

Em que casos se deve usar e não usar ajudantes?

Supersônico
fonte

Respostas:

27

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.phpem cada módulo e deixá-lo vazio.

Marius
fonte
O único "uso" real que encontrei para os ajudantes é que eles garantem que eles sempre serão um singleton. Eu trabalhei em algum código legado educacional que carregava coleções dentro de foreachloops 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 em getModelvez de getSingletonse eu a tivesse colocado em um modelo.
Luke Rodgers
@LukeRodgers. Entendo o seu ponto de vista, mas não acho que "possa ter chamado acidentalmente getModel em vez de getSingleton" seja qualificado como um motivo real para usar ajudantes. Posso argumentar que você pode "acidentalmente" chamar "excluir" em vez de "salvar". Que proteção você pode fazer para evitar isso? Eu acho que "prestar atenção" faz parte do desenvolvimento de software.
Marius
Acordado. Nesses cenários, acho que estou apenas tentando codificar defensivamente contra a humanidade.
Luke Rodgers
Como você adicionaria métodos personalizados aos auxiliares principais?
tecjam
13

A questão tem dois aspectos:

  1. Devo escrever meus próprios ajudantes e para quê?
  2. Devo usar os auxiliares principais e para quê?

1. Ajudando a escrever

Em geral, tendo aulas com o nome Helper, Utilou 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 staticou mesmo functionssem 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_Abstractse 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.


2. Usando ajudantes

Consumir os ajudantes principais é algo que você fará com bastante frequência.

Exemplos:

  • __()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 XML
  • Mage::helper('core') métodos: data localizada, formatação de preço e moeda, dados de escape e codificação
  • Mage::helper('tax') métodos para obter informações da configuração do imposto e calcular preços com base nesse
  • Mage::helper('catalog/image') fornece uma interface para criar imagens de catálogo redimensionadas e em cache e recuperar seu URL
  • Mage::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_Compareque possui uma $_itemCollectionpropriedade que só pode ser inicializada uma vez e uma $_customerIdpropriedade 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/imageauxiliar 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:

  • Os auxiliares principais contêm ferramentas úteis.
  • Você precisa de ajudantes para tradução
  • Os ajudantes devem ser apátridas
  • Nos seus próprios módulos, evite usar ajudantes como coleções de funções sortidas. Na maioria dos casos, você pode encontrar um local mais apropriado
Fabian Schmengler
fonte
Costumo usar ajudantes em integrações simples de ERP baseadas em arquivos simples. Tudo o que eles fazem é gravar e ler arquivos de diretórios locais e atualizar outros objetos (produto, pedido, etc.). Eles não têm estados ou tabelas correspondentes próprias nas instâncias mencionadas. Qual é a sua opinião sobre isso?
Musicliftsme
1
Isso viola "sem efeitos colaterais". Minha opinião habitual na leitura e escrita de arquivos são Readere Writermodelos, 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 OrderStatusCsvReadermodelo usado por um OrderStatusUpdatermodelo. Desta forma, eu também separar as preocupações "ler dados de arquivo" e "fim atualização no Magento"
Fabian Schmengler
4

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.

Fabian Blechschmidt
fonte
2

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.

Patrick van Bergen
fonte
1

As ajudas são úteis para evitar códigos duplicados (em modelos, modelos, ...) e, às vezes, são apenas necessários.

  • para verificar se o seu módulo personalizado está ativado, você pode colocar algo como 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:
    • se, por exemplo, o caminho da configuração mudar por algum motivo, basta ajustar um arquivo
    • você pode reescrever o isEnabled()método helpers e isso afetará todas as classes que o usam, em vez de reescrever vários arquivos
  • 13 @ Como escrever uma extensão personalizada? : Não reescreva classes a menos que seja necessário. Use observadores e se não for possível usar métodos auxiliares que recebem como parâmetro e instância de uma classe que você deseja substituir. Errado: Substitua Mage_Catalog_Model_Productpara adicionar o método getProductArticles(). Certo . No seu ajudante, adicionegetProductArticles(Mage_Catalog_Model_Product $product)
  • flexibilize as atualizações de layout usando <action method="someMethod"><var helper="module/method" /></action>

Você pode simplesmente criar um auxiliar chamado Data.phpem cada módulo e deixá-lo vazio .

Ao usar o PHPUnit, você deve adicionar uma única linha :protected $_moduleName = 'My_Module';

sv3n
fonte