Wann werden Ereignisse in einem benutzerdefinierten Modul ausgelöst?


14

Dies ist eine Frage zu Magento 1 und Magento 2.

Ich verstehe, dass Modulentwickler von Drittanbietern aufgefordert werden, Ereignisse in ihrem benutzerdefinierten Modul auszulösen, um die Arbeit mit anderen Modulen zu vereinfachen.

Ich würde gerne wissen:

  • Wo soll ein Entwickler Ereignisse in einem benutzerdefinierten Modul auslösen?
  • Gibt es einen empfohlenen Ort für den Versand von Veranstaltungen? ZB Controller, Modelle, Blöcke, Helfer, Beobachter?
  • Wie wirken sich Dispatching-Ereignisse auf die Leistung aus?

Ja! gute Frage. jemand bitte beantworten Sie diese Frage. Es ist sowohl für Entwickler von Erweiterungen von Drittanbietern als auch für benutzerdefinierte Projekte sehr hilfreich.
Mapaladiya

Antworten:


10

Sie werden hier keine gute, klare und deterministische Antwort finden. Im Großen und Ganzen sollten Sie Ereignisse in Ihrem Modul dort auslösen, wo Sie und Ihre Benutzer sie benötigen. Wenn Sie nicht wissen, wo sie möglicherweise benötigt werden, müssen Sie sie nicht auslösen. Magento selbst sendet so viele Ereignisse an so vielen verschiedenen Orten aus (Steuerung vor / nach dem Versand, jede Rohoperation usw.), dass Ihr Modul bereits eine Reihe nützlicher Ereignisse sendet, ohne dass Sie etwas unternehmen.

Da dies nicht zufriedenstellend ist, möchten Sie, dass Ihr Modul ein Ereignis auslöst, wenn Ihr Modul eine Aktion ausführt, zu der Ihre Benutzer Elemente hinzufügen, daraus löschen, ändern oder eine separate Aktion ausführen möchten, die von der ursprünglichen Aktion unabhängig ist. Zum Beispiel - Magento hat ein visitor_initEreignis , das nicht Teil seiner Standard-Suite von automatisch generierten Ereignissen ist. Mit diesem Ereignis können Programmierer das Besucherobjekt ändern, bevor Magento Daten protokolliert. Dies konnten die ursprünglichen Modulentwickler nicht deterministisch wissenHier musste ein Ereignis hinzugefügt werden - wahrscheinlich aufgrund von Funktionsanfragen und / oder Interviews mit Systembenutzern. Wissen, was Ihre Benutzer wollen, und wenn es nicht möglich / praktisch ist, eine UI / UX zu erstellen, die sie über den Administrator ausführen können, fügen Sie einen Ereignis-Hook hinzu, damit ein anderer Programmierer dies für sie tun kann.

Weniger sexy kann das Hinzufügen von Ereignissen auch eine kostengünstige Möglichkeit sein, Entwicklern (entweder Ihren Benutzern oder sogar Ihrem Team) das Hinzufügen von Funktionen zu einem kniffligen Teil des Codes zu ermöglichen, den jeder zu berühren fürchtet. Platzieren Sie Ihren dispatchEventAnruf in der Mitte des Codes, schließen Sie ihn an, und Sie können Ihre Funktionalität hinzufügen, ohne den Code im ursprünglichen Bereich zu stören. [Editor: Außerdem sollten Sie diesen schrecklichen Code irgendwann überarbeiten]

In Bezug auf die Leistung hängt das Hinzufügen eines Ereignisses zum Versand davon ab, wo Sie es hinzufügen. Wenn Sie dispatchevent aufrufen , muss Magento einige zusätzliche PHP-Aufrufe durchführen, die Konfiguration für konfigurierte Beobachter abfragen und die Beobachter dann anrufen. Einmal gemacht, ist dies eine günstige Ergänzung im Rahmen eines Standard-Magento-Versands. Dies kann sich jedoch summieren, wenn dies wiederholt durchgeführt wird (beispielsweise vor jedem Rendern eines Blocks). Hier gibt es keine gute Faustregel - wie immer lautet die richtige Antwort Profil.

Schließlich ist es mit Magento 2 noch zu früh, dies zu sagen. Das alles gilt immer noch - das Plugin-System fügt jedoch ein paar Falten hinzu. Plugins sind aus einer Sicht eine Möglichkeit , ereignisähnliches Verhalten für jeden öffentlichen Methodenaufruf in Magento zu erzeugen . Wenn Sie Ihre Klassen richtig gestalten, sollten Sie theoretisch nie eine Veranstaltung brauchen. In der Praxis ist es jedoch eine verlockende Lösung für Magento-Entwickler, ein Ereignis in einen geschützten oder privaten Methodencode zu ziehen, wenn es sich bei der Alternative um einen langen Refactoring-Prozess handelt. Darüber hinaus kann das Erstellen eines speziell benannten Ereignisses für Entwickler, die Ihr Modul verwenden, häufig zu einer freundlicheren Erfahrung führen.

Ich hoffe, das hilft!


9

Für Magento 1 sind gute Zeiten zum Auslösen von Ereignissen vor und nach allen CRUD-Operationen sowie vor und nach dem Rendern. Viele davon werden bereits von den abstrakten Klassen im Kern bereitgestellt, sodass in der Praxis nicht viele Ereignisse von Drittanbietern erforderlich sind.

Bei Magento 2 ist die Situation anders. Da öffentliche Methodenaufrufe mit Plugins abgefangen werden können, sind keine benutzerdefinierten Ereignisse mehr erforderlich.
Beim Entwerfen von Klassen ist es besser, eine große Klasse in mehrere kleinere Klassen zu zerlegen, anstatt jede Methode einfach öffentlich zu machen, damit sie abgefangen werden kann.
Jede der kleineren Klassen könnte dann eine oder zwei gut benannte und abfangbare öffentliche Methoden haben.


0

Wie Vinai sagte, vor / nach CRUD-Operationen. Ein weiterer wichtiger Ort zum Versenden von Ereignissen sind Adminhtml-Formularblöcke (falls zutreffend). Auf diese Weise können Sie neue Eingabefelder hinzufügen, wenn Sie benutzerdefinierte Attribute / Felder hinzugefügt haben, ohne die Admin-Formularblöcke neu schreiben zu müssen. (Dies ist für Magento 1). Siehe Beispiel


0

In Magento 1 können Sie Ereignisse über die automatisch ausgelösten Ereignisse nutzen. Sie müssen lediglich die Eigenschaften $_eventPrefixund $_eventObjectfür Ihre Modelle festlegen . Außerdem haben Sie benutzerdefinierte Controller-Ereignisse über die Ereignisse 'controller_action_predispatch_ ' . $this->getFullActionName()und 'controller_action_postdispatch_' . $this->getFullActionName()auf dem Controller automatisch ausgelöst . Diese können Sie den größten Teil des Weges dorthin bringen.

Halten Sie für Magento 2 Ihre Methoden innerhalb Ihrer Klassen öffentlich. Dadurch können Plugins Ihre Methoden abfangen. Wenn Sie dies befolgen, müssen Sie keine benutzerdefinierten Ereignisse erstellen.

Ich hoffe das hilft!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.