Повернення $ this після спостерігача


27

В інтернеті і в сторонніх модулях я бачу деяку суперечливу інформацію - це вимога чи найкраща практика повернутися $thisв кінці методу спостерігача?

Наприклад:

MyCompany_Module_Model_Observer.php

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

Відповіді:


30

Ядро завжди return $this;в контексті методів спостерігачів - але насправді, здається, це не є причиною.

Повернувшись назад, dispatchEvent()ви знайдете основний метод, який викликає методи спостерігачів (в ./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;
}

Але в жодному разі повернене значення, яке ніколи фактично не використовується або посилається, передається іншому спостерігачеві по ланцюгу.

Можливо, Magento думав довший термін використовувати його як якийсь засіб для збереження / передачі даних в $thisекземплярі класу поза використанням сеансів / реєстру; або це міг бути застарілий код, який щойно застряг .

Я не бачу переконливої ​​причини для цього return $this- але, якщо говорити, якщо вони це роблять в основі, це ми робимо.

Як правило, що б не було в основі - ми вважаємо найкращу практику. За винятком шокуючих орфографічних помилок :)


6
"Ukringlish" :-)
орієнтири

Мені соромно визнати, що інколи повертаю $ спостерігача, щоб позбутися попередження IDE про невикористаний параметр ...
Даніел Слоуф

@Daniel - просто не додавай параметр у підпис спостерігача. PHP не проти. Але знову ж таки пройдений парам може знадобитися в майбутньому.
nevvermind

7

$ this (каламбур) називається вільним інтерфейсом. Це дозволяє викликати кілька методів всередині об'єкта, не звертаючись до визначеної змінної.


1
Дякую - я розумію плавні інтерфейси. Я шукаю вагомий привід повернутися, $thisколи дійсно немає корисності для вільних інтерфейсів для спостерігачів.
philwinkle

1
@Kevin - Вам не потрібен вільний інтерфейс у спостерігачів Мага. Не те, що я знаю.
неввермінд

5

Це просто умова Magento завжди повертатися $thisзамість void(нічого), якщо метод не має іншого значення повернення, незалежно від того, чи він фактично використовується для вільного інтерфейсу будь-де чи ні.

Перевага полягає в тому, що вам не потрібно думати про те, корисно це чи ні, а зайвий плавний інтерфейс кращий за відсутній. Також Magento може почати використовувати їх для спостерігачів, хоча це вкрай малоймовірно.


0

Через кілька років ... :)

Ядро завжди повертає $ this; у контексті методів спостерігачів - [...]

або

Це просто умова Magento завжди повертати $ this замість void (нічого), якщо метод не має іншого значення повернення [...]

Насправді ні. Просто перевірили деяких спостерігачів у 1.9.3.x, і багато хто нічого не повертає ( void). Тож не зовсім зрозуміло "який основний код робить";)

Я також використовував $return $this;свій код, але сьогодні - не буде змін у коді M1 - я б його залишив. Я думаю - якщо я читаю код інших - voidметод більш зрозумілий, ніж той із сліпо доданим return $this, який ніколи не використовується.


Редагувати:

Якщо ви використовуєте Aoe_Scheduler, ви також можете повернути a stringабо arrayвідобразити його в історії хронів .

введіть тут опис зображення

Не вдається знайти жодних документів для цих функцій ... пов'язаний код тут: https://github.com/AOEpeople/Aoe_Scheduler/blob/master/app/code/community/Aoe/Scheduler/Model/Schedule.php#L229- L259

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.