Magento 1: Modellumschreiben vs. Event-Dispatching, beste Strategie?

7

Ich arbeite an einem Modul, in dem ich das Verhalten der getTracking()Methode in einem Versandmodenträgermodell ändern muss . Nehmen wir zum Beispiel diesen Standard: Mage_Usa_Model_Shipping_Carrier_Dhl

Meine Anforderung besteht darin, das von dieser Methode zurückgegebene Tracking-Ergebnis zu ändern.

Ich habe zwei Lösungen im Sinn, bin mir aber nicht sicher, ob die eine oder die andere besser ist (oder vielleicht gibt es eine dritte Lösung, die noch besser ist).

Lösung 1: Klassisches Umschreiben

Schreiben Sie das Modell und die Methode neu und fügen Sie meine benutzerdefinierte Änderung vor der return-Anweisung hinzu.

Der Code würde folgendermaßen aussehen:

public function getTracking()
{
    $result = parent::getTracking();
    // My modifications here
    return $result;
}

Lösung 2: Umschreiben und Ereignis auslösen

Schreiben Sie das Modell und die Methode neu. Holen Sie sich das ursprüngliche Ergebnis mit parent::getTracking, senden Sie ein benutzerdefiniertes Ereignis und geben Sie das Ergebnis zurück. Verwenden Sie einen Beobachter , um die Ergebnisse zu ändern.

Der Code würde folgendermaßen aussehen:

public function getTracking()
{
    $result = parent::getTracking();
    Mage::dispatchEvent('my_custom_event', array('result' => $result));
    return $result;
}

Für mich ist die zweite Lösung besser, aber ich fühle mich beim Umschreiben nicht gut.

Meine Fragen sind also:

  • Welche dieser Lösungen ist die beste?
  • Gibt es ein dynamisches Ereignis, von dem ich nicht weiß, dass ich es beobachten kann, anstatt dies alles zu tun?
  • Irgendwelche anderen Vorschläge ?
Raphael beim digitalen Pianismus
quelle
2
Magento 2 Plugins, wo bist du, wenn wir dich brauchen?
Raphael bei Digital Pianism
3
genau hier: github.com/danslo/Danslo_Aop
Sander Mangel
4
In anderen Nachrichten: Dies ist eine sehr "meinungsbasierte" Frage. Jetzt möchte ich nicht gleich abstimmen, sondern wollte es nur veröffentlichen
Sander Mangel
1
@ SandersMangel gut, ich denke nicht, dass es eine meinungsbasierte Frage ist, weil ich nach einer "3. Lösung"
frage

Antworten:

9

IMHO hängt es davon ab, was Sie tun werden:

1. Einmaliger schneller und schmutziger Code:

Wenn Ihr Code in einem einzelnen Projekt verbleibt und Sie der einzige sind, der ihn bearbeitet, kann ein einzelnes Umschreiben eine gute Idee sein, da ich keinen guten Grund sehe, die Codekomplexität mit einem Beobachter zu erhöhen.

2. Wiederverwendbarer Code:

Wenn Sie so etwas wie eine Community-Erweiterung erstellen möchten , kann das Hinzufügen eines Beobachters eine gute Idee sein, da dies anderen Personen die Möglichkeit gibt, mit ihr zu interagieren.

Phoenix128_RiccardoT
quelle
6

In einer wiederverwendbaren Erweiterung würde ich den Event-Ansatz bevorzugen. Vorteile: Benutzer der Erweiterung können ihre eigenen Änderungen hinzufügen, ohne Ihren Code zu ändern. Das Lösen potenzieller Umschreibekonflikte ist einfach

In einem Projekt ist die zusätzliche Indirektion normalerweise nicht die Mühe wert. Ich möchte es lieber einfach halten , aber schreiben Sie den Code so, dass ein Refactoring zu einer ereignisbasierten Lösung weiterhin möglich ist, wenn Sie weitere Änderungen hinzufügen oder das Modul veröffentlichen möchten.

Fabian Schmengler
quelle
Vielen Dank dafür, ich schätze die Eingabe, ich denke, Imma geht mit # 1, da ich nicht
vorhabe
5

Als Mage_Usa_Model_Shipping_Carrier_Dhl::getTracking()öffentliche Methode besteht eine dritte praktikable Option darin, einen Interceptor über https://github.com/danslo/Danslo_Aop zu verwenden .

Soweit ich weiß, ist dies die einzige Option, mit der Sie ein Umschreiben vermeiden können.

Mein Bestes.

Alessandro Ronchi
quelle
4

Ich mag die Idee von Solution 2: rewrite and event dispatched

Wenn das Ereignis die beste Idee ist, aber in einigen Fällen, für unsere Anforderungen, ist es nicht effektiv, wenn wir es neu schreiben müssen. Dann ist es wahr, dass das Umschreiben von Klassen Konfliktprobleme haben kann .

Zuerst neu schreiben und dann ein Ereignis erstellen ist die beste Lösung, um das Ergebnis zu manipulieren.

Bcoz,

weniger Code schreiben in Ihrer Rewrite-Klasse

Sie können dieses benutzerdefinierte Ereignis in anderen Geschäftsfällen verwenden, in denen Sie möchten

Amit Bera
quelle
4

Na Raphael sehr gute Frage.

Dies hängt von der Situation ab, in der Sie die einzige Person sind, die daran arbeitet, oder von einem Team, das daran arbeitet.

1) Lösung 1 hier anwendbar

Wenn Sie der einzige sind, der arbeitet, können Sie diese Methode gemäß Ihren Anforderungen umschreiben, und Sie wissen, wenn Sie in Zukunft Änderungen vorgenommen haben, können Sie diese direkt ändern, da dies jetzt Ihr eigener Code ist

2) Lösung 2 hier anwendbar

Wenn Sie mit einem Team zusammenarbeiten und möglicherweise eine bestimmte Anzahl von Personen diese Methode zu diesem Zeitpunkt neu schreiben muss, entscheiden Sie sich für diese Lösung, damit andere, die diese Methode neu schreiben müssen, anstatt sie neu zu schreiben, den Ereignisbeobachter verwenden können.

Oder

Wenn Sie eine Erweiterung erstellen, ist auch Lösung 2 gut, da eine andere Person, die diese Erweiterung gekauft hat und dieselbe Methode ändern muss, Ihren Beobachter verwenden kann.

Murtuza Zabuawala
quelle