Restituisce $ questo dopo l'osservatore


27

Vedo alcune informazioni contrastanti su Internet e in moduli di terze parti allo stesso modo: è un requisito o una buona pratica tornare $thisalla fine di un metodo di osservazione?

Per esempio:

MyCompany_Module_Model_Observer.php

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

Risposte:


30

Il nucleo sempre return $this;nel contesto dei metodi di osservazione - ma in realtà non sembra esserne una ragione.

Tornando indietro dispatchEvent()troverai il metodo principale che chiama i metodi di osservazione (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;
}

Ma in nessun caso il valore di ritorno viene mai effettivamente utilizzato o referenziato per essere passato a un altro osservatore lungo la catena.

Forse Magento stava pensando a lungo termine di usarlo come mezzo per conservare / passare i dati all'interno $thisdell'istanza di classe al di fuori dell'uso di sessioni / registro; o potrebbe essere stato il codice legacy che si è appena bloccato .

Non riesco a vedere un motivo convincente per return $this- ma detto questo, se lo fanno nel profondo, è quello che facciamo.

Come regola generale, qualunque sia il core, riteniamo le migliori pratiche. Con l'eccezione degli scioccanti errori di ortografia :)


6
"Ukringlish" :-)
benmarks

Mi vergogno di ammettere che a volte restituisco $ osservatore per sbarazzarmi dell'avvertimento IDE del parametro inutilizzato ...
Daniel Sloof

@Daniel - semplicemente non aggiungere il parametro nella firma dell'osservatore. A PHP non importa. Ma ancora una volta, il parametro passato potrebbe essere necessario in futuro.
nevvermind,

7

$ this (gioco di parole intenzionale) si chiama interfaccia fluente. Consente di chiamare più metodi all'interno di un oggetto senza fare riferimento a una variabile definita.


1
Grazie - capisco le interfacce fluenti. Sto cercando un motivo convincente per tornare $thisquando non c'è davvero alcun uso di interfacce fluide sugli osservatori.
Filwinkle,

1
@Kevin - Non hai bisogno di un'interfaccia fluida negli osservatori di Mage. Non che io sappia.
nevvermind,

5

È solo una convenzione di Magento a restituire sempre $thisanziché void(nulla) se un metodo non ha altri valori di ritorno, indipendentemente dal fatto che venga effettivamente utilizzato per un'interfaccia fluida ovunque o meno.

Il vantaggio è che non devi pensare se è utile o meno e un'interfaccia fluida superflua è migliore di una mancante. Inoltre, Magento potrebbe iniziare a usarli per gli osservatori, anche se è altamente improbabile.


0

Alcuni anni dopo ... :)

Il core restituisce sempre $ questo; nel contesto dei metodi di osservazione - [...]

o

È solo una convenzione di Magento a restituire sempre $ this invece di void (niente) se un metodo non ha altri valori di ritorno [...]

No davvero. Ho appena controllato alcuni osservatori in 1.9.3.x e molti non restituiscono nulla ( void). Quindi non è veramente chiaro "cosa fa il codice di base";)

Ho usato anche il $return $this;mio codice, ma oggi - non ci saranno cambiamenti nel codice M1 - lo lascerei. Penso che - se leggo il codice degli altri - un voidmetodo è più chiaro di uno con un cieco aggiunto return $this, che non viene mai usato.


Modificare:

Se usi Aoe_Scheduler puoi anche restituire un stringo arrayper visualizzarlo nella cronologia.

inserisci qui la descrizione dell'immagine

Non è possibile trovare alcun documento per queste funzionalità ... codice correlato qui: https://github.com/AOEpeople/Aoe_Scheduler/blob/master/app/code/community/Aoe/Scheduler/Model/Schedule.php#L229- L259

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.