Вопрос

Я вижу некоторую противоречивую информацию как в Интернете, так и в сторонних модулях - является ли это требованием или наилучшей практикой для возврата $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 Чтобы показать его в истории Крона.

enter image description here

Не могу найти никаких документов для этих функций ... Связанный код здесь: https://github.com/aoepeople/aoe_scheduler/blob/master/app/code/community/aoe/scheduler/model/schedule.php#l229-l259

Лицензировано под: CC-BY-SA с атрибуция
Не связан с magento.stackexchange
scroll top