Возвращая $this после observer
-
16-10-2019 - |
Вопрос
Я вижу некоторую противоречивую информацию как в Интернете, так и в сторонних модулях - является ли это требованием или наилучшей практикой для возврата $this
в конце метода наблюдателя?
Например.:
MyCompany_Module_Model_Observer.php
public function salesOrderSaveAfter($observer){
//do stuff
return $this;
}
Решение
Ядро всегда 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
- но, как бы то ни было, если они делают это в ядре, то это то, что делаем и мы.
Как правило, что бы ни делало ядро, мы считаем это наилучшей практикой. За исключением шокирующих орфографических ошибок :)
Другие советы
$ Это (каламбур) называется свободным интерфейсом. Это позволяет вам вызывать несколько методов в объекте, не возвращаясь к определенной переменной.
Это просто соглашение о магенто, чтобы всегда возвращаться $this
вместо void
(ничего), если метод не имеет другого возвращаемого значения, независимо от того, что он фактически используется для бегемого интерфейса где угодно или нет.
Преимущество в том, что вам не нужно думать о том, полезно ли это или нет, а лишний раздела бегства лучше, чем отсутствующий. Также, Magento мощь Начните использовать их для наблюдателей, хотя это очень маловероятно.
Несколько лет спустя ... :)
Ядро всегда возвращает $ это; В контексте методов наблюдателя - [...
или же
Это просто соглашение Magento, чтобы всегда возвращать $ это вместо void (ничего), если метод не имеет другого возвращаемого значения [...
Нет на самом деле. Только что проверил некоторых наблюдателей в 1.9.3.x, и многие ничего не возвращают (void
) Так что не совсем ясно «что делает основной код»;)
Я использовал $return $this;
В моем коде, но сегодня - в коде M1 не будет никаких изменений - я бы оставил его. Я думаю - если я прочитаю код других - void
Метод более четкий, чем один со слепо return $this
, это никогда не используется.
Редактировать:
Если вы используете AOE_Scheduler, вы также можете вернуть string
или же array
Чтобы показать его в истории Крона.
Не могу найти никаких документов для этих функций ... Связанный код здесь: https://github.com/aoepeople/aoe_scheduler/blob/master/app/code/community/aoe/scheduler/model/schedule.php#l229-l259