Devolver $ this después del observador

27

Veo información contradictoria en Internet y en módulos de terceros por igual: ¿es un requisito o una mejor práctica regresar $thisal final de un método de observación?

P.ej:

MyCompany_Module_Model_Observer.php

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

Respuestas:

30

El núcleo siempre return $this;en el contexto de los métodos de observación, pero en realidad no parece haber una razón para ello.

Al rastrear dispatchEvent(), encontrará el método principal que llama a los métodos de observación (en ./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;
}

Pero en ningún momento el valor de retorno se usa o se hace referencia para pasar a otro observador en la cadena.

Quizás Magento estaba pensando a largo plazo para usarlo como un medio para retener / pasar datos dentro de $thisla instancia de clase fuera del uso de sesiones / registro; o podría haber sido un código heredado que se acaba de pegar .

No puedo ver una razón convincente para hacerlo return $this, pero dicho esto, si lo hacen en el núcleo, eso es lo que hacemos.

Como regla general, haga lo que haga el núcleo, consideramos las mejores prácticas. Con la excepción de los errores ortográficos impactantes :)

Ben Lessani - Sonassi
fuente
66
"Ukringlish" :-)
puntos de referencia
Me da vergüenza admitir que a veces devuelvo $ observador para deshacerme de la advertencia IDE del parámetro no utilizado ...
Daniel Sloof
@Daniel: simplemente no agregue el parámetro en la firma del observador. A PHP no le importa. Pero, de nuevo, el parámetro aprobado podría ser necesario en el futuro.
nevvermind
7

$ this (juego de palabras) se llama una interfaz fluida. Le permite llamar a varios métodos dentro de un objeto sin tener que volver a consultar una variable definida.

Kevin Schroeder
fuente
1
Gracias, entiendo las interfaces fluidas. Estoy buscando una razón convincente para regresar $thiscuando realmente no hay uso de interfaces fluidas en los observadores.
philwinkle
1
@Kevin: no necesitas una interfaz fluida en los observadores de Mage. No que yo sepa.
nevvermind
5

Es solo una convención de Magento devolver siempre en $thislugar de void(nada) si un método no tiene otro valor de retorno, independientemente de si realmente se usa para una interfaz fluida en cualquier lugar o no.

La ventaja es que no necesita pensar si es útil o no, y una interfaz fluida superflua es mejor que la que falta. Además, Magento podría comenzar a usarlos para observadores, aunque esto es muy poco probable.

Fabian Schmengler
fuente
0

Algunos años despues ... :)

El núcleo siempre devuelve $ this; en el contexto de los métodos de observación - [...]

o

Es solo una convención de Magento devolver siempre $ this en lugar de anular (nada) si un método no tiene otro valor de retorno [...]

No realmente. Acabo de comprobar algunos observadores en 1.9.3.xy muchos no devuelven nada ( void). Así que no está realmente claro "qué hace el código central";)

También he usado $return $this;mi código, pero hoy, no habrá cambios en el código M1, lo dejaría. Creo que, si leo el código de otros, un voidmétodo es más claro que uno con un agregado ciego return $this, que nunca se usa.


Editar:

Si se utiliza Aoe_Scheduler también se puede devolver una stringo arrayvisualizarlo en la historia de cron.

ingrese la descripción de la imagen aquí

No puedo encontrar ningún documento para estas características ... código relacionado aquí: https://github.com/AOEpeople/Aoe_Scheduler/blob/master/app/code/community/Aoe/Scheduler/Model/Schedule.php#L229- L259

sv3n
fuente