$ This nach dem Beobachter zurückgeben


27

Ich sehe einige widersprüchliche Informationen im Internet und in Modulen von Drittanbietern. Ist es eine Anforderung oder eine bewährte $thisMethode, am Ende einer Beobachtermethode zurückzukehren?

Z.B:

MyCompany_Module_Model_Observer.php

public function salesOrderSaveAfter($observer){
    //do stuff
    return $this;
}

Antworten:


30

Der Kern immer return $this;im Kontext von Beobachtermethoden - aber es scheint eigentlich keinen Grund dafür zu geben.

Wenn Sie zurückblättern dispatchEvent(), finden Sie die Hauptmethode, die Observer-Methoden aufruft (in ./app/Core/Model/App.php).

protected function _callObserverMethod($object, $method, $observer)
{
    if (method_exists($object, $method)) {
        $object->$method($observer);
    } elseif (Mage::getIsDeveloperMode()) {
        Mage::throwException('Method "'.$method.'" is not defined in "'.get_class($object).'"');
    }
    return $this;
}

Zu keinem Zeitpunkt wird der tatsächlich verwendete oder referenzierte Rückgabewert an einen anderen Beobachter in der Kette weitergegeben.

Vielleicht dachte Magento längerfristig darüber nach, es als Mittel zu verwenden, um Daten innerhalb der $thisKlasseninstanz zu behalten / weiterzugeben , ohne Sitzungen / Registrierung zu verwenden. oder es könnte Legacy-Code gewesen sein, der gerade hängen geblieben ist .

Ich kann keinen zwingenden Grund dafür sehen return $this- aber wenn sie es im Kern tun, dann tun wir das auch.

Grundsätzlich gilt, was auch immer der Kern tut - wir sind der Meinung, dass dies die beste Vorgehensweise ist. Mit Ausnahme der schockierenden Rechtschreibfehler :)


6
"Ukringlish" :-)
benmarks

Ich schäme mich zuzugeben, dass ich manchmal $ observer zurückschicke, um die IDE-Warnung vor nicht verwendeten Parametern
Daniel Sloof

@Daniel - füge den Parameter einfach nicht in die Observer-Signatur ein. PHP hat nichts dagegen. Andererseits wird der übergebene Parameter möglicherweise in Zukunft benötigt.
nevvermind

7

$ this (Wortspiel beabsichtigt) wird als fließendes Interface bezeichnet. Sie können mehrere Methoden innerhalb eines Objekts aufrufen, ohne auf eine definierte Variable zurückgreifen zu müssen.


1
Danke - ich verstehe fließende Schnittstellen. Ich suche nach einem zwingenden Grund, zurückzukehren, $thiswenn es wirklich keinen Sinn macht, Beobachter mit fließenden Schnittstellen auszustatten.
Philwinkle

1
@ Kevin - Sie brauchen keine fließende Benutzeroberfläche für die Beobachter von Magier. Nicht, dass ich davon Wüste.
nevvermind

5

Es ist nur eine Magento-Konvention, immer $thisstatt void(nichts) zurückzugeben, wenn eine Methode keinen anderen Rückgabewert hat, unabhängig davon, ob sie tatsächlich für eine flüssige Schnittstelle irgendwo verwendet wird oder nicht.

Der Vorteil ist, dass Sie nicht darüber nachdenken müssen, ob es nützlich ist oder nicht, und eine überflüssig flüssige Benutzeroberfläche ist besser als eine fehlende. Magento verwendet sie möglicherweise auch für Beobachter, auch wenn dies höchst unwahrscheinlich ist.


0

Einige Jahre später ... :)

Der Kern gibt immer $ this zurück; im Kontext von Beobachtermethoden - [...]

oder

Es ist nur eine Magento-Konvention, immer $ this anstelle von void (nothing) zurückzugeben, wenn eine Methode keinen anderen Rückgabewert hat [...]

Nicht wirklich. Habe gerade einige Beobachter in 1.9.3.x überprüft und viele haben nichts zurückgegeben ( void). Also ist es nicht wirklich klar, "was der Kerncode macht";)

Ich habe $return $this;in meinem Code auch verwendet, aber heute - es wird keine Änderungen im M1-Code geben - würde ich es verlassen. Ich denke, wenn ich anderen Code lese void, ist eine Methode klarer als eine mit einem Blindzusatz return $this, der niemals verwendet wird.


Bearbeiten:

Wenn Sie Aoe_Scheduler verwenden, können Sie auch ein stringoder zurückgeben array, um es im Cron-Verlauf anzuzeigen.

Bildbeschreibung hier eingeben

Hier finden Sie keine Dokumente zu diesen Funktionen ... Zugehöriger Code: https://github.com/AOEpeople/Aoe_Scheduler/blob/master/app/code/community/Aoe/Scheduler/Model/Schedule.php#L229- L259

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.