Was ist Helfer in Magento?
In welchen Fällen sollte man Helfer benutzen und nicht benutzen?
Was ist Helfer in Magento?
In welchen Fällen sollte man Helfer benutzen und nicht benutzen?
Antworten:
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.
Die Frage hat zwei Aspekte:
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 sogar functions
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:
public function getFooBar()
{
return Mage::getStoreConfig('module/foo/bar');
}
Factory-Methoden für Bibliotheksklassen
public function getNewFooService()
{
return new \Foo\Service(...);
}
Sie könnten andere Orte finden, aber IMHO, der Modul-Helfer ist oft genug für solche Dinge.
Die Kernhelfer zu konsumieren, ist etwas, was Sie ziemlich oft tun werden.
__()
Übersetzungsmethode: Um eine Übersetzung eines bestimmten Moduls zu erhalten, sollten Sie verwenden Mage::helper('module-alias')->__('string to be translated')
. Dies geschieht implizit, wenn Sie $this->__(...)
innerhalb einer Vorlage oder eines Blocks verwenden und das translate="..."
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 passieren init()
zuerst die aktuellen Zustand zurücksetzt, dann Sie verschiedene Parameter einstellen (wie resize()
, 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:
Reader
und Writer
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 ein OrderStatusCsvReader
Modell, das von einem OrderStatusUpdater
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.
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.
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 es Mage::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ügen getProductArticles()
. Richtig . In Ihrem Helfer hinzufügengetProductArticles(Mage_Catalog_Model_Product $product)
<action method="someMethod"><var helper="module/method" /></action>
Sie können
Data.php
in jedem Modul einfach einen Helfer erstellen, der aufgerufen wird, und diesen leer lassen .
Wenn Sie PHPUnit verwenden, sollten Sie eine einzelne Zeile hinzufügen :protected $_moduleName = 'My_Module';
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.