オブザーバーの後に$ thisを返す


27

インターネットとサードパーティのモジュールで矛盾する情報がいくつかあります- $thisオブザーバーメソッドの最後に戻ることは要件ですか、それともベストプラクティスですか?

例えば:

MyCompany_Module_Model_Observer.php

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

回答:


30

コアは常に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が、それは言われています、もし彼らがコアでそれをするなら、それが私たちのすることです。

原則として、コアが何をしても、ベストプラクティスと見なされます。衝撃的なスペルミスを除いて :)


6
「ウクライナ語」:-)
ベンマーク

私は...私は時々使用されていないパラメータのIDEの警告を取り除くために$オブザーバーを返すことを認めることを恥ずかしい
ダニエルSloof

@Daniel-オブザーバーシグネチャにパラメーターを追加しないでください。PHPは気にしません。しかし、再度、渡されたパラメーターは将来必要になる可能性があります。
nevvermind

7

$ this(意図したしゃれ)は、流れるようなインターフェースと呼ばれます。定義された変数を参照せずに、オブジェクト内の複数のメソッドを呼び出すことができます。


1
ありがとう-私は流interfacesなインターフェイスを理解しています。私は$this、オブザーバーの流れるようなインターフェイスが本当に役に立たないときに戻ってくる説得力のある理由を探しています。
philwinkle

1
@Kevin-Mageのオブザーバーに流fluentなインターフェイスは必要ありません。私が知っていることではありません。
nevvermind

5

メソッドが他の戻り値を持たない場合、実際にどこかで流なインターフェースに使用されているかどうかに関係$thisなく、常にvoid(何も)代わりに(何も)返さないという単なるMagentoの規則です。

利点は、それが有用かどうかを考える必要がなく、余分な流interfaceなインターフェースが欠落しているインターフェースよりも優れていることです。また、Magento 、これはほとんどあり得ないことですが、オブザーバーにそれらの使用を開始する可能性があります。


0

数年後... :)

コアは常に$ thisを返します。オブザーバーメソッドのコンテキスト-[...]

または

メソッドが他の戻り値を持たない場合、常にvoid(nothing)の代わりに$ thisを返すのは単なるMagentoの慣例です[...]

いやいや。1.9.3.xの一部のオブザーバーをチェックしただけで、多くのオブザーバーは何も返しません(void)。したがって、「コアコードが何をするのか」は本当に明確ではありません;)

$return $this;も自分のコードで使用しましたが、今日-M1コードに変更はありません-そのままにします。私は他のコードを読んだ場合、voidメソッドは盲目的に追加されたものよりも明確であると思いますreturn $this、それは決して使用されません。


編集:

Aoe_Schedulerを使用している場合は、stringまたはarrayを返し、cron履歴に表示することもできます。

ここに画像の説明を入力してください

この機能のドキュメントが見つかりません...関連するコードはこちら:https : //github.com/AOEpeople/Aoe_Scheduler/blob/master/app/code/community/Aoe/Scheduler/Model/Schedule.php#L229- L259

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.