Zwracam to po obserwatorze

27

Widzę niektóre sprzeczne informacje zarówno w Internecie, jak i w modułach innych firm - czy jest to wymóg lub najlepsza praktyka, aby powrócić $thisna końcu metody obserwatora?

Na przykład:

MyCompany_Module_Model_Observer.php

public function salesOrderSaveAfter($observer){
    //do stuff
    return $this;
}
philwinkle
źródło

Odpowiedzi:

30

Rdzeń zawsze return $this;w kontekście metod obserwacyjnych - ale tak naprawdę nie ma powodu.

Śledząc wstecz dispatchEvent()znajdziesz główną metodę, która wywołuje metody obserwatora (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;
}

Ale w żadnym momencie wartość zwrotna nigdy nie była faktycznie używana ani przywoływana, aby mogła zostać przekazana innemu obserwatorowi w dół łańcucha.

Być może Magento myślało w dłuższej perspektywie, aby użyć go jako pewnego środka do przechowywania / przekazywania danych w $thisinstancji klasy poza wykorzystaniem sesji / rejestru; lub może to być przestarzały kod, który właśnie utknął .

Nie widzę ważnego powodu return $this- ale biorąc to pod uwagę, jeśli robią to w rdzeniu, właśnie to robimy.

Zasadą jest, że cokolwiek robi rdzeń - uważamy za najlepszą praktykę. Z wyjątkiem szokujących błędów ortograficznych :)

Ben Lessani - Sonassi
źródło
6
„Ukringlish” :-)
zyskuje
Wstydzę się przyznać, że czasami zwracam $ obserwatora, aby pozbyć się ostrzeżenia IDE o niewykorzystanym parametrze ...
Daniel Sloof
@Daniel - po prostu nie dodawaj parametru do podpisu obserwatora. PHP nie ma nic przeciwko. Ale z drugiej strony przekazany parametr może być potrzebny w przyszłości.
nevvermind
7

$ this (zamierzone słowo) nazywa się płynnym interfejsem. Pozwala na wywołanie wielu metod w obiekcie bez konieczności odwoływania się do zdefiniowanej zmiennej.

Kevin Schroeder
źródło
1
Dziękuję - rozumiem płynne interfejsy. Szukam ważnego powodu, aby powrócić, $thisgdy naprawdę nie ma potrzeby używania płynnych interfejsów obserwatorów.
philwinkle
1
@Kevin - Nie potrzebujesz płynnego interfejsu w obserwatorach Maga. Nie żebym o tym wiedział.
nevvermind
5

To tylko konwencja Magento, aby zawsze zwracać $thiszamiast void(nic), jeśli metoda nie ma innej wartości zwracanej, niezależnie od tego, czy faktycznie jest używana dla płynnego interfejsu gdziekolwiek, czy nie.

Zaletą jest to, że nie trzeba się zastanawiać, czy jest to przydatne, czy nie, a zbędny płynny interfejs jest lepszy niż brakujący. Ponadto Magento może zacząć używać ich do obserwatorów, chociaż jest to bardzo mało prawdopodobne.

Fabian Schmengler
źródło
0

Kilka lat później ... :)

Rdzeń zawsze zwraca $ to; w kontekście metod obserwacyjnych - [...]

lub

To tylko konwencja Magento, aby zawsze zwracać $ zamiast void (nic), jeśli metoda nie ma innej wartości zwracanej [...]

Nie naprawdę. Właśnie sprawdziłem niektórych obserwatorów w 1.9.3.x i wielu nic nie zwraca ( void). Więc nie jest do końca jasne, „co robi kod podstawowy”;)

Użyłem również $return $this;mojego kodu, ale dziś - nie będzie żadnych zmian w kodzie M1 - zostawię go. Myślę, że - jeśli czytam inne kody - voidmetoda jest bardziej przejrzysta niż metoda z ślepo dodanym return $this, która nigdy nie jest używana.


Edytować:

Jeśli używasz Aoe_Scheduler, możesz również zwrócić a stringlub arraywyświetlić go w historii cron.

wprowadź opis zdjęcia tutaj

Nie mogę znaleźć żadnych dokumentów dla tej funkcji ... powiązany kod tutaj: https://github.com/AOEpeople/Aoe_Scheduler/blob/master/app/code/community/Aoe/Scheduler/Model/Schedule.php#L229- L259

sv3n
źródło