Cos'è l'helper in Magento?
In quali casi si dovrebbe usare e non usare gli helper?
Cos'è l'helper in Magento?
In quali casi si dovrebbe usare e non usare gli helper?
Risposte:
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.php
in ciascun modulo e lasciarlo vuoto.
La domanda ha due aspetti:
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 static
o anche functions
senza 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.
Il consumo degli helper di base è qualcosa che farai abbastanza spesso.
__()
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 XMLMage::helper('core')
metodi: data localizzata, formulazione di prezzi e valute, escape e codifica dei datiMage::helper('tax')
metodi per ottenere informazioni dalla configurazione fiscale e calcolare i prezzi in base a quelloMage::helper('catalog/image')
fornisce un'interfaccia per creare immagini di catalogo memorizzate nella cache e ridimensionate e recuperare il loro URLMage::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_Compare
che ha una $_itemCollection
proprietà che può essere inizializzata solo una volta e una $_customerId
proprietà 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/image
helper 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:
Reader
e Writer
modelli, 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 OrderStatusCsvReader
modello utilizzato da un OrderStatusUpdater
modello. In questo modo separo anche le preoccupazioni "leggi i dati dal file" e "aggiorna l'ordine in Magento"
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.
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.
Gli aiuti sono utili per prevenire la duplicazione del codice (in modelli, modelli, ...) e talvolta sono necessari.
Mage::getStoreConfigFlag('my/module/enabled')
a ogni file in cui vuoi controllare questo, o usi Mage::helper('my_module')->isEnabled()
con vantaggi:
isEnabled()
metodo degli helper e questo influenzerà tutte le classi che lo usano, invece di riscrivere diversi fileMage_Catalog_Model_Product
per aggiungere il metodo getProductArticles()
. Destra . Nel tuo aiuto aggiungigetProductArticles(Mage_Catalog_Model_Product $product)
<action method="someMethod"><var helper="module/method" /></action>
Puoi semplicemente creare un helper chiamato
Data.php
in ciascun modulo e lasciarlo vuoto .
Quando usi PHPUnit devi aggiungere una sola riga :protected $_moduleName = 'My_Module';
foreach
loop 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 chiamatogetModel
invece chegetSingleton
se li avessi inseriti in un modello.