Was ist Helfer in Magento?
In welchen Fällen sollte man Helfer benutzen und nicht benutzen?
quelle
Was ist Helfer in Magento?
In welchen Fällen sollte man Helfer benutzen und nicht benutzen?
Theoretisch sollte man niemals Helfer einsetzen.
Helfer sind nur Sammlungen von nicht verwandten Methoden und werden immer als Singletons instanziiert.
Dies ist im Grunde eine prozedurale Programmierung mit Funktionen, die unter einem bestimmten Namespace (in diesem Fall dem Klassennamen) gruppiert sind. Da Magento jedoch über Helfer im Kern verfügt, können Sie Ihre Methoden dort ablegen, sodass Sie keine Ahnung haben, wo sie abgelegt werden sollen oder ob Sie sie an vielen verschiedenen Stellen (Modellen, Controllern, Vorlagen) aufrufen müssen.
Verwenden Sie sie als letzten Ausweg.
Außerdem benötigt Magento aus Übersetzungsgründen für jedes Modul einen Helfer.
Sie können Data.php
in jedem Modul einfach einen Helfer erstellen, der aufgerufen wird, und diesen leer lassen.
foreach
Schleifen und allerlei Wahnsinn geladen hat. Ich fand es nützlich, diese erschreckende Logik für einen Helfer neu zu faktorisieren und als Objekt-Cache zu verwenden, und ließ wenig Raum für Fehler von zukünftigen Entwicklern, die möglicherweise versehentlich aufgerufen haben,getModel
anstattgetSingleton
sie in ein Modell zu platzieren.Die Frage hat zwei Aspekte:
1. Helfer schreiben
Im Allgemeinen haben Klassen genannt
Helper
,Util
oder ähnliches sagt nur „Ich habe einige Funktionen haben , dass ich weiß nicht , wo zu setzen“ und nicht viel Sinn als eine Klasse machen.Magento instanziiert Helfer als Singletons und die meisten Core-Helfer haben keinen Status, daher können die Methoden auch
static
oder sogarfunctions
ohne Klasse sein. All dies wird oft als Codegeruch angesehen , als Fehler im Anwendungsdesign.Wie Marius bereits betont hat, müssen Sie keine Helfer für Ihren eigenen Code verwenden. Erstellen Sie einfach einen leeren Standardhelfer pro Modul, wenn Sie modulspezifische Übersetzungen verwenden, da diese sonst nicht funktionieren. Bevorzugen Sie Modelle (die nicht erweitert werden müssen,
Mage_Core_Model_Abstract
wenn sie keine Datenbankdaten darstellen) oder unabhängige Bibliotheksklassen.Ich würde jedoch nicht zu streng damit sein, "überhaupt keine Helfer zu verwenden" und sie stattdessen für Abfrageverknüpfungen wie die folgenden zu verwenden:
Zugangsmodul Konfiguration:
Factory-Methoden für Bibliotheksklassen
Sie könnten andere Orte finden, aber IMHO, der Modul-Helfer ist oft genug für solche Dinge.
2. Helfer einsetzen
Die Kernhelfer zu konsumieren, ist etwas, was Sie ziemlich oft tun werden.
Beispiele:
__()
Übersetzungsmethode: Um eine Übersetzung eines bestimmten Moduls zu erhalten, sollten Sie verwendenMage::helper('module-alias')->__('string to be translated')
. Dies geschieht implizit, wenn Sie$this->__(...)
innerhalb einer Vorlage oder eines Blocks verwenden und dastranslate="..."
Attribut in XML-Dateien verwendenMage::helper('core')
Methoden: Lokalisierte Datums-, Preis- und Währungsformatierung, Escaping und Codierung von DatenMage::helper('tax')
Methoden, um Informationen aus der Steuerkonfiguration abzurufen und darauf basierend die Preise zu berechnenMage::helper('catalog/image')
Bietet eine Schnittstelle zum Erstellen von zwischengespeicherten und in der Größe veränderten Katalogbildern und zum Abrufen ihrer URLMage::helper('catalog/product_url_rewrite')->joinTableToSelect()
Verknüpft die URL-Umschreibtabelle mit einer Produktsammlungsabfrage.In den Core-Hilfsprogrammen sind viele weitere (mehr oder weniger) nützliche Funktionen verborgen. Wenn Sie eine bestimmte Funktionalität benötigen, die wahrscheinlich irgendwo im Core verwendet wird, prüfen Sie, ob Sie eine Hilfsmethode wiederverwenden können.
Normalerweise sind diese Helfer statusfreie Objekte und die Methoden sind Abfragemethoden (dh sie haben keine Nebenwirkungen).
Aber wie immer bricht Magento seine eigenen ungeschriebenen Regeln und sollte nicht als Beispiel genommen werden. Ein "gutes" Beispiel dafür, wie man keine Helfer verwendet
Mage_Catalog_Helper_Product_Compare
, ist eine$_itemCollection
Eigenschaft, die nur einmal initialisiert werden kann, und eine$_customerId
Eigenschaft, die mit einem Setter geändert werden kann. Sie finden einige weitere Hilfsprogramme zum Katalog mit angehängten Sammlungen. Es macht keinen Spaß, Tests für Code zu schreiben, der sie verwendet, oder sie in einem anderen Kontext wiederzuverwenden. Tun Sie dies also bitte nicht zu Hause.Der
catalog/image
oben erwähnte Helfer ist ein weiteres Beispiel für einen Helfer, der eigentlich kein Helfer sein sollte. Sie benötigen ein Produkt mit passiereninit()
zuerst die aktuellen Zustand zurücksetzt, dann Sie verschiedene Parameter einstellen (wieresize()
,setQuality()
) und am Ende können Sie die URL mit seiner bekommen__toString()
Methode. Das sieht gut aus, wenn es in einer Vorlage verwendet wird, aber der Code ist ein großes Durcheinander und macht als Singleton keinen Sinn.TL; DR:
quelle
Reader
undWriter
Modelle, die tatsächlich tun Zustand haben (zumindest eine Datei - Ressource). Zum Beispiel zum Lesen von Auftragsstatusdaten aus einer CSV-Datei hätte ich etw. lika einOrderStatusCsvReader
Modell, das von einemOrderStatusUpdater
Modell verwendet wird. Auf diese Weise trenne ich auch die Bedenken "Daten aus Datei lesen" und "Reihenfolge in Magento aktualisieren"Marius hat recht. Ich halte Helfer für Unsinn.
Aber in der Magento-Theorie sollte man alles in Helfer stecken, die den Zustand eines Objekts nicht verändern, zB formatierten Preis erhalten.
Aber alles, was Sie in einen Helfer stecken können, können Sie auch in ein Modell stecken. Außerdem können Sie verschiedene Instanzen eines Modells erhalten, was zum Testen hilfreich ist.
quelle
Ich bin ziemlich neu in Magento, aber für mich sieht es so aus, als wäre ein Helper das Äquivalent eines Dienstes von Magento : "Eine Reihe verwandter Softwarefunktionalitäten, die für verschiedene Zwecke wiederverwendet werden können". Ein Modul exportiert seine angebotene Funktionalität über Dienste. Verwenden Sie einen Helfer für die Funktionen, zu deren Verwendung Sie andere Module einladen.
Ein Modell sollte nur Methoden bereitstellen, die in direktem Zusammenhang mit dem Abrufen oder Festlegen des Status eines Objekts stehen oder die auf andere Weise mit dem instanziierten Objekt des Modells verknüpft sind.
quelle
Hilfen sind nützlich, um doppelten Code (in Modellen, Vorlagen, ...) zu verhindern, und manchmal sind sie nur notwendig.
Mage::getStoreConfigFlag('my/module/enabled')
jede Datei platzieren, in der Sie dies überprüfen möchten, oder Sie verwenden esMage::helper('my_module')->isEnabled()
mit Vorteilen:isEnabled()
Methode umschreiben und sie wirkt sich auf alle Klassen aus, die sie verwenden, anstatt mehrere Dateien umzuschreibenMage_Catalog_Model_Product
, um die Methode hinzuzufügengetProductArticles()
. Richtig . In Ihrem Helfer hinzufügengetProductArticles(Mage_Catalog_Model_Product $product)
<action method="someMethod"><var helper="module/method" /></action>
Wenn Sie PHPUnit verwenden, sollten Sie eine einzelne Zeile hinzufügen :
protected $_moduleName = 'My_Module';
quelle