Cos'è l'helper in Magento?


Risposte:


27

Teoricamente non dovresti mai usare gli helper.
Gli helper sono solo raccolte di metodi non correlati e sono sempre istanziati come singoli.
Questa è sostanzialmente una programmazione procedurale con funzioni raggruppate in alcuni spazi dei nomi (il nome della classe in questo caso). Ma poiché Magento ha degli helper nel cuore, puoi inserire i tuoi metodi in modo da non avere idea di dove posizionarli o se devi chiamarli in molti luoghi diversi (modelli, controller, modelli)

Usali come ultima risorsa.

Inoltre Magento richiede un supporto per ciascun modulo per motivi di traduzione.
Puoi semplicemente creare un helper chiamato Data.phpin ciascun modulo e lasciarlo vuoto.


L'unico "uso" reale che ho trovato per gli aiutanti è che sono garantiti per essere sempre un singleton. Ho lavorato su un codice legacy educativo che stava caricando raccolte all'interno di foreachloop e ogni sorta di follia. Ho trovato utile il ricondizionamento di questa terrificante logica a un aiutante e l'utilizzo come cache degli oggetti, lasciando poco spazio agli errori dei futuri sviluppatori che potrebbero aver accidentalmente chiamato getModelinvece che getSingletonse li avessi inseriti in un modello.
Luke Rodgers,

@LukeRodgers. Vedo il tuo punto, ma non credo che "potrebbe aver accidentalmente chiamato getModel invece di getSingleton" si qualifica come un vero motivo per utilizzare gli helper. Posso dire che puoi "chiamare" per sbaglio "elimina" invece di "salvare". Quale protezione puoi fare per evitarlo? Immagino che "prestare attenzione" sia parte dello sviluppo del software.
Marius

Concordato. In questi scenari immagino che sto solo cercando di codificare difensivamente contro l'umanità.
Luke Rodgers,

Come faresti per aggiungere metodi personalizzati agli helper principali?
tecjam,

13

La domanda ha due aspetti:

  1. Dovrei scrivere i miei aiutanti e per cosa?
  2. Dovrei usare gli helper core e per cosa?

1. Scrivere aiutanti

In generale, avendo le classi nominate Helper,Util o simili semplicemente dice "Ho alcune funzioni che non so dove mettere" e non faccio molto senso come classe.

Magento istanzia gli helper come singoli e la maggior parte degli helper principali non ha alcun stato, quindi i metodi potrebbero anche essere statico anche functionssenza una classe. Tutto ciò è spesso considerato un odore di codice , un difetto nella progettazione dell'applicazione.

Come già sottolineato da Marius, non è necessario utilizzare gli helper per il proprio codice. È sufficiente creare un helper vuoto predefinito per modulo se si utilizzano traduzioni specifiche del modulo, altrimenti non funzioneranno. Preferisci i modelli (che non devono essere estesiMage_Core_Model_Abstract se non rappresentano dati di database) o classi di librerie indipendenti.

Tuttavia, non sarei troppo severo sul "non usare affatto gli helper" e invece li userei per le scorciatoie di query come:

  • configurazione del modulo di accesso:

    public function getFooBar() 
    {
        return Mage::getStoreConfig('module/foo/bar');
    }
  • metodi di fabbrica per le classi di biblioteca

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

Potresti trovare altri posti ma IMHO, l'helper del modulo è spesso abbastanza buono per cose del genere.


2. Utilizzo degli helper

Il consumo degli helper di base è qualcosa che farai abbastanza spesso.

Esempi:

  • __()metodo di traduzione: per ottenere una traduzione di un modulo specifico, è necessario utilizzare Mage::helper('module-alias')->__('string to be translated'). Ciò accade implicitamente se si utilizza $this->__(...)all'interno di un modello o blocco e se si utilizzatranslate="..." attributo nei file XML
  • Mage::helper('core') metodi: data localizzata, formulazione di prezzi e valute, escape e codifica dei dati
  • Mage::helper('tax') metodi per ottenere informazioni dalla configurazione fiscale e calcolare i prezzi in base a quello
  • Mage::helper('catalog/image') fornisce un'interfaccia per creare immagini di catalogo memorizzate nella cache e ridimensionate e recuperare il loro URL
  • Mage::helper('catalog/product_url_rewrite')->joinTableToSelect() unisce la tabella di riscrittura URL a una query di raccolta prodotti.

Ci sono molte più (più o meno) funzioni utili nascoste negli helper principali, se hai bisogno di una funzionalità specifica che probabilmente verrà utilizzata nel core da qualche parte, controlla se puoi riutilizzare un metodo helper.

Generalmente questi helper sono oggetti senza stato e i metodi sono metodi di query (ovvero non hanno effetti collaterali)

Ma come sempre Magento infrange le proprie regole non scritte e non dovrebbe essere preso come esempio. Un "buon" esempio su come non usare gli helper è quello Mage_Catalog_Helper_Product_Compareche ha una $_itemCollectionproprietà che può essere inizializzata solo una volta e una $_customerIdproprietà che può essere modificata con un setter. Troverai altri helper relativi al catalogo con raccolte allegate. Scrivere test per il codice che li utilizza o riutilizzarli in contesti diversi non è divertente, quindi per favore non farlo a casa.

L' catalog/imagehelper di cui sopra è un altro esempio di helper che in realtà non dovrebbe essere un aiuto. Devi prima passare un prodotto init()che ripristina il suo stato attuale, quindi imposti vari parametri (come resize(), setQuality()) e alla fine puoi ottenere l'URL con il suo __toString()metodo. Sembra carino se usato in un modello ma il codice è un casino enorme e non ha senso come singleton.


TL; DR:

  • Gli helper principali contengono strumenti utili.
  • Hai bisogno di aiutanti per la traduzione
  • Gli aiutanti dovrebbero essere apolidi
  • Nei tuoi moduli, evita di utilizzare gli helper come raccolte di funzioni assortite. Nella maggior parte dei casi puoi trovare un posto più appropriato

Ho spesso usato gli helper in semplici integrazioni ERP basate su file flat. Tutto ciò che fanno sono scrivere e leggere file da directory locali e aggiornare altri oggetti (prodotto, ordine, ecc.). Non hanno stati o tabelle corrispondenti nelle istanze menzionate. Cosa ne pensi di questo?
musicliftsme,

1
Ciò viola "nessun effetto collaterale". Il mio solito assumere la lettura e la scrittura di file sono Readere Writermodelli, che in realtà fare avere stato (almeno una risorsa file). Ad esempio, per leggere i dati sullo stato dell'ordine da un file CSV avrei avuto sth. come un OrderStatusCsvReadermodello utilizzato da un OrderStatusUpdatermodello. In questo modo separo anche le preoccupazioni "leggi i dati dal file" e "aggiorna l'ordine in Magento"
Fabian Schmengler,

4

Marius ha ragione. Penso che gli aiutanti non abbiano senso.

Ma nella teoria del magento dovresti mettere tutto in helper che non cambi lo stato di un oggetto, ad esempio ottenere un prezzo formattato.

Ma tutto ciò che puoi mettere in un aiuto, puoi anche inserire un modello. E puoi ottenere diverse istanze di un modello, il che è utile per i test.


2

Sono abbastanza nuovo in Magento, ma a me sembra che un Helper sia l'equivalente di un servizio di Magento : "un insieme di funzionalità software correlate che possono essere riutilizzate per scopi diversi". Un modulo esporta la sua funzionalità offerta attraverso i servizi. Utilizzare un aiuto per le funzioni che si invitano ad altri moduli da utilizzare.

Un modello deve fornire solo metodi che sono direttamente correlati all'ottenimento o all'impostazione dello stato di un oggetto o che sono altrimenti collegati all'oggetto istanziato del modello.


1

Gli aiuti sono utili per prevenire la duplicazione del codice (in modelli, modelli, ...) e talvolta sono necessari.

  • per verificare se il tuo modulo personalizzato è abilitato, puoi posizionare qualcosa di simile Mage::getStoreConfigFlag('my/module/enabled')a ogni file in cui vuoi controllare questo, o usi Mage::helper('my_module')->isEnabled()con vantaggi:
    • se ad esempio il percorso di configurazione cambia per qualche motivo, devi solo regolare un file
    • puoi riscrivere il isEnabled()metodo degli helper e questo influenzerà tutte le classi che lo usano, invece di riscrivere diversi file
  • 13th @ Come scrivere un'estensione personalizzata? : Non riscrivere le classi se non è necessario. Usa gli osservatori e, se non è possibile usare metodi helper che ricevono come parametro e istanza di una classe che desideri sovrascrivere. Sbagliato: sovrascrivere Mage_Catalog_Model_Productper aggiungere il metodo getProductArticles(). Destra . Nel tuo aiuto aggiungigetProductArticles(Mage_Catalog_Model_Product $product)
  • rendere più flessibili gli aggiornamenti del layout usando <action method="someMethod"><var helper="module/method" /></action>

Puoi semplicemente creare un helper chiamato Data.phpin ciascun modulo e lasciarlo vuoto .

Quando usi PHPUnit devi aggiungere una sola riga :protected $_moduleName = 'My_Module';

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.