Retornando $ this após o observador

27

Vejo algumas informações conflitantes na Internet e nos módulos de terceiros - é um requisito ou prática recomendada retornar $thisno final de um método de observação?

Por exemplo:

MyCompany_Module_Model_Observer.php

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

Respostas:

30

O núcleo sempre return $this;no contexto dos métodos de observação - mas na verdade não parece haver uma razão para isso.

No rastreamento, dispatchEvent()você encontrará o método principal que chama métodos de observador (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;
}

Mas em nenhum momento o valor de retorno realmente usado ou referenciado é passado para outro observador na cadeia.

Talvez o Magento estivesse pensando em longo prazo para usá-lo como um meio de reter / passar dados dentro da $thisinstância da classe, fora do uso de sessões / registro; ou poderia ter sido um código legado que acabou de ficar preso .

Não vejo uma razão convincente para isso return $this- mas, dito isso, se eles fazem isso no centro, é isso que fazemos.

Como regra geral, o que quer que o núcleo faça - consideramos as melhores práticas. Com exceção dos erros de ortografia chocantes :)

Ben Lessani - Sonassi
fonte
6
"Ukringlish" :-)
benmarks 22/02
Tenho vergonha de admitir que às vezes eu voltar $ observador para se livrar de aviso IDE do parâmetro não utilizado ...
Daniel Sloof
@ Daniel - apenas não adicione o parâmetro na assinatura do observador. PHP não se importa. Mas, novamente, o parâmetro passado pode ser necessário no futuro.
Nevevind
7

$ this (trocadilhos) é chamado de interface fluente. Ele permite que você chame vários métodos dentro de um objeto sem precisar se referir a uma variável definida.

Kevin Schroeder
fonte
11
Obrigado - eu entendo interfaces fluentes. Estou procurando um motivo convincente para retornar $thisquando realmente não há uso de interfaces fluentes nos observadores.
22413 philwinkle
11
@ Kevin - Você não precisa de uma interface fluente nos observadores de Mage. Não que eu saiba.
Nevevoind
5

É apenas uma convenção do Magento sempre retornar em $thisvez de void(nada) se um método não tiver outro valor de retorno, independentemente de ser realmente usado para uma interface fluente em qualquer lugar ou não.

A vantagem é que você não precisa pensar se é útil ou não, e uma interface fluente supérflua é melhor do que uma ausente. Além disso, o Magento pode começar a usá-los para observadores, mesmo que isso seja altamente improvável.

Fabian Schmengler
fonte
0

Alguns anos depois ... :)

O núcleo sempre retorna $ this; no contexto dos métodos de observação - [...]

ou

É apenas uma convenção do Magento sempre retornar $ this em vez de void (nada) se um método não tiver outro valor de retorno [...]

Não mesmo. Acabei de verificar alguns observadores em 1.9.3.xe muitos não retornam nada ( void). Portanto, não está claro "o que o código principal faz";)

Também usei $return $this;no meu código, mas hoje - não haverá alterações no código M1 - eu o deixaria. Eu acho - se eu leio o código de outros - um voidmétodo é mais claro do que um método adicionado cegamente return $this, que nunca é usado.


Editar:

Se estiver usando Aoe_Scheduler, você também pode retornar um stringou arraypara exibi-lo no histórico do cron.

insira a descrição da imagem aqui

Não é possível encontrar documentos para esses recursos ... código relacionado aqui: https://github.com/AOEpeople/Aoe_Scheduler/blob/master/app/code/community/Aoe/Scheduler/Model/Schedule.php#L229- L259

sv3n
fonte