Retour de $ this après l'observateur


27

Je vois des informations contradictoires sur Internet et dans les modules tiers - est-ce une exigence ou une meilleure pratique de revenir $thisà la fin d'une méthode d'observation?

Par exemple:

MyCompany_Module_Model_Observer.php

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

Réponses:


30

Le noyau toujours return $this;dans le contexte des méthodes d'observation - mais il ne semble pas y avoir de raison.

En remontant, dispatchEvent()vous trouverez la méthode principale qui appelle les méthodes d'observation (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;
}

Mais à aucun moment la valeur de retour n'a jamais été réellement utilisée ou référencée pour être transmise à un autre observateur en aval de la chaîne.

Peut-être que Magento envisageait à plus long terme de l'utiliser comme moyen de conserver / transmettre des données dans l' $thisinstance de classe en dehors de l'utilisation des sessions / du registre; ou il pourrait s'agir d'un code hérité qui vient de se bloquer .

Je ne vois pas de raison impérieuse de return $this - mais cela étant dit, s'ils le font dans le cœur, c'est ce que nous faisons.

En règle générale, quoi que fasse le noyau - nous considérons les meilleures pratiques. À l'exception des fautes d'orthographe choquantes :)


6
"Ukringlish" :-)
benmarks

J'ai honte d'admettre que je retourne parfois $ observer pour me débarrasser de l'avertissement IDE d'un paramètre inutilisé ...
Daniel Sloof

@Daniel - n'ajoutez simplement pas le paramètre dans la signature de l'observateur. PHP ne dérange pas. Mais là encore, le paramètre adopté pourrait être nécessaire à l'avenir.
nevvermind

7

$ this (jeu de mots) est appelé une interface fluide. Il vous permet d'appeler plusieurs méthodes au sein d'un objet sans avoir à faire référence à une variable définie.


1
Merci - je comprends les interfaces fluides. Je cherche une raison impérieuse de revenir $thisquand il n'y a vraiment aucune utilité pour les interfaces fluides sur les observateurs.
philwinkle

1
@Kevin - Vous n'avez pas besoin d'une interface fluide dans les observateurs de Mage. Pas que je sache de.
nevvermind

5

C'est juste une convention Magento de toujours revenir $thisau lieu devoid (rien) si une méthode n'a pas d'autre valeur de retour, qu'elle soit réellement utilisée pour une interface fluide n'importe où ou non.

L'avantage est que vous n'avez pas besoin de vous demander si c'est utile ou non, et une interface fluide superflue est meilleure qu'une interface manquante. De plus, Magento pourrait commencer à les utiliser pour les observateurs, même si cela est hautement improbable.


0

Quelques années plus tard ... :)

Le noyau retourne toujours $ this; dans le cadre des méthodes d'observation - [...]

ou

C'est juste une convention Magento de toujours retourner $ this au lieu de void (rien) si une méthode n'a pas d'autre valeur de retour [...]

Pas vraiment. Je viens de vérifier certains observateurs dans 1.9.3.x et beaucoup ne renvoient rien ( void). Donc ce n'est pas vraiment clair "ce que fait le code principal";)

J'ai également utilisé $return $this;mon code, mais aujourd'hui - il n'y aura pas de changement dans le code M1 - je le laisse. Je pense - si je lis le code des autres - une voidméthode est plus claire que celle avec un aveuglément ajouté return $this, qui n'est jamais utilisée.


Modifier:

Si vous utilisez Aoe_Scheduler, vous pouvez également retourner un stringou arraypour l'afficher dans l'historique cron.

entrez la description de l'image ici

Je ne trouve aucun document pour ces fonctionnalités ... code connexe ici: https://github.com/AOEpeople/Aoe_Scheduler/blob/master/app/code/community/Aoe/Scheduler/Model/Schedule.php#L229- L259

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.