Was ist Helfer in Magento?

22

Was ist Helfer in Magento?

In welchen Fällen sollte man Helfer benutzen und nicht benutzen?

Überschall
quelle

Antworten:

28

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.phpin jedem Modul einfach einen Helfer erstellen, der aufgerufen wird, und diesen leer lassen.

Marius
quelle
Der einzige wirkliche "Nutzen", den ich für Helfer gefunden habe, ist, dass sie garantiert immer ein Singleton sind. Ich habe an einem pädagogischen Legacy-Code gearbeitet, der Sammlungen innerhalb von foreachSchleifen 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, getModelanstatt getSingletonsie in ein Modell zu platzieren.
Luke Rodgers
@ LukeRodgers. Ich verstehe Ihren Standpunkt, aber ich glaube nicht, dass der versehentliche Aufruf von getModel anstelle von getSingleton einen echten Grund für die Verwendung von Helfern darstellt. Ich kann argumentieren, dass Sie "versehentlich" "Löschen" anstelle von "Speichern" aufrufen können. Welchen Schutz können Sie bieten, um dies zu vermeiden? Ich denke, "Aufpassen" ist Teil der Softwareentwicklung.
Marius
Einverstanden. In diesen Szenarien versuche ich wohl nur, defensiv gegen die Menschheit zu programmieren.
Luke Rodgers
Wie würden Sie vorgehen, um den zentralen Hilfsprogrammen benutzerdefinierte Methoden hinzuzufügen?
Tecjam
13

Die Frage hat zwei Aspekte:

  1. Soll ich meine eigenen Helfer schreiben und wofür?
  2. Soll ich die Core-Helfer verwenden und wofür?

1. Helfer schreiben

Im Allgemeinen haben Klassen genannt Helper, Utiloder ä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 staticoder sogar functionsohne 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_Abstractwenn 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.


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 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 verwenden
  • Mage::helper('core') Methoden: Lokalisierte Datums-, Preis- und Währungsformatierung, Escaping und Codierung von Daten
  • Mage::helper('tax') Methoden, um Informationen aus der Steuerkonfiguration abzurufen und darauf basierend die Preise zu berechnen
  • Mage::helper('catalog/image') Bietet eine Schnittstelle zum Erstellen von zwischengespeicherten und in der Größe veränderten Katalogbildern und zum Abrufen ihrer URL
  • Mage::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 $_itemCollectionEigenschaft, die nur einmal initialisiert werden kann, und eine $_customerIdEigenschaft, 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/imageoben 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:

  • Die zentralen Helfer enthalten nützliche Tools.
  • Sie brauchen Helfer für die Übersetzung
  • Helfer sollten staatenlos sein
  • Vermeiden Sie in Ihren eigenen Modulen die Verwendung von Helfern als sortierte Funktionssammlungen. In den meisten Fällen finden Sie einen geeigneteren Ort
Fabian Schmengler
quelle
Bei einfachen ERP-Integrationen, die auf Flatfiles basieren, habe ich häufig Helfer eingesetzt. Sie schreiben und lesen lediglich Dateien aus lokalen Verzeichnissen und aktualisieren andere Objekte (Produkt, Bestellung usw.). Sie haben in den genannten Fällen keine eigenen Zustände oder entsprechende Tabellen. Wie sehen Sie das?
Musicliftsme
1
Das verletzt "keine Nebenwirkungen". Meine übliche nehmen auf das Lesen und Schreiben von Dateien sind Readerund WriterModelle, 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 OrderStatusCsvReaderModell, das von einem OrderStatusUpdaterModell verwendet wird. Auf diese Weise trenne ich auch die Bedenken "Daten aus Datei lesen" und "Reihenfolge in Magento aktualisieren"
Fabian Schmengler
4

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.

Fabian Blechschmidt
quelle
2

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.

Patrick van Bergen
quelle
1

Hilfen sind nützlich, um doppelten Code (in Modellen, Vorlagen, ...) zu verhindern, und manchmal sind sie nur notwendig.

  • Um zu überprüfen, ob Ihr benutzerdefiniertes Modul aktiviert ist, können Sie so etwas wie 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:
    • Wenn sich zB der Konfigurationspfad aus irgendeinem Grund ändert, müssen Sie nur eine Datei anpassen
    • Sie können die helpers- isEnabled()Methode umschreiben und sie wirkt sich auf alle Klassen aus, die sie verwenden, anstatt mehrere Dateien umzuschreiben
  • 13. @ Wie schreibe ich eine benutzerdefinierte Erweiterung? : Schreiben Sie keine Klassen neu, es sei denn, dies ist erforderlich. Verwenden Sie Beobachter, und wenn es nicht möglich ist, Hilfsmethoden zu verwenden, die als Parameter und Instanz einer Klasse empfangen werden, die Sie überschreiben möchten. Falsch: Überschreiben Mage_Catalog_Model_Product, um die Methode hinzuzufügen getProductArticles(). Richtig . In Ihrem Helfer hinzufügengetProductArticles(Mage_Catalog_Model_Product $product)
  • Machen Sie Layout-Updates flexibler mit <action method="someMethod"><var helper="module/method" /></action>

Sie können Data.phpin 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';

sv3n
quelle