在观察者之后返回$ this


27

我在互联网上以及在第三方模块中都看到了一些冲突的信息- $this在观察者方法结束时返回是一种要求还是最佳实践?

例如:

MyCompany_Module_Model_Observer.php

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

Answers:


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
“乌克兰语” :-)
benmarks

我很
ham

@Daniel-只是不要在观察者签名中添加参数。PHP不介意。但是话又说回来,将来可能需要通过传递的参数。
nevvermind

7

$ this(双关语意味)称为流畅接口。它使您可以在一个对象内调用多个方法,而不必返回引用已定义的变量。


1
谢谢-我了解流畅的界面。我正在寻找一个令人信服的理由,要求$this当观察者的流利接口真正没有用时返回。
philwinkle

1
@Kevin-在Mage的观察者中不需要流畅的界面。从来没听说过。
nevvermind

5

这是一个Magento约定,如果某个方法没有其他返回值,则总是返回$this而不是void(什么都没有),无论该方法实际上是否在任何地方都用于流畅的接口。

好处是,您无需考虑它是否有用,并且多余的流利界面比缺少的界面要好。同样,Magento 可能会开始将它们用作观察者,即使这种可能性很小。


0

几年后... :)

核心总是返回$ this; 在观察者方法的上下文中-[...]

要么

如果方法没有其他返回值,总是返回$ this而不是void(什么都没有)只是Magento约定[...]

不完全是。刚刚在1.9.3.x中检查了一些观察者,许多观察者什么也不返回(void)。因此,目前尚不清楚“核心代码做什么”;)

$return $this;也在我的代码中使用过,但是今天-M1代码中没有任何更改-我将保留它。我认为-如果我阅读其他代码-一种void方法会比使用盲目添加的方法更清晰return $this,这是永远不会使用的。


编辑:

如果使用Aoe_Scheduler,您还可以返回stringarray在cron历史记录中显示它。

在此处输入图片说明

找不到与此功能有关的任何文档...相关代码在这里:https : //github.com/AOEpeople/Aoe_Scheduler/blob/master/app/code/community/Aoe/Scheduler/Model/Schedule.php#L229- L259

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.