Magento:Observer方法getCustomer()为NULL

时间:2013-05-07 21:24:18

标签: magento extension-methods

好的,我有一个观察者正在观察controller_action_postdispatch_customer_account_createpost动作。我的问题是,在方法中我尝试执行以下操作:

public function customerSaveAfter($observer)
{
    /** @var Mage_Customer_Model_Customer $customer */
    $customer = $observer->getEvent()->getCustomer();
}

无论我做什么,$ customer都是NULL。还有另一个在此之前调用的扩展,它以完全相同的方式使用该方法并提供给客户。请帮忙。

1 个答案:

答案 0 :(得分:2)

客户对象为空,因为controller_action_postdispatch_customer_account_createpost事件是控制器操作事件,与客户对象无关。该事件在以下代码中发布

#File: app/code/core/Mage/Core/Controller/Varien/Action.php
public function postDispatch()
{
    if ($this->getFlag('', self::FLAG_NO_POST_DISPATCH)) {
        return;
    }

    Mage::dispatchEvent(
        'controller_action_postdispatch_'.$this->getFullActionName(),
        array('controller_action'=>$this)
    );
    Mage::dispatchEvent(
        'controller_action_postdispatch_'.$this->getRequest()->getRouteName(),
        array('controller_action'=>$this)
    );
    Mage::dispatchEvent('controller_action_postdispatch', array('controller_action'=>$this));
}

具体来说,

Mage::dispatchEvent(
    'controller_action_postdispatch_'.$this->getRequest()->getRouteName(),
    array('controller_action'=>$this)
);

位。 ($this->getRequest()->getRouteName()返回customer_account_createpost)。注意

array('controller_action'=>$this)

传递给事件调度 - 这意味着您可以使用以下

从观察者访问控制器对象
$observer->getControllerAction();
$observer->getData('controller_action');

您还可以使用

获取带有观察者的数据键变量列表
var_dump(
    array_keys($observer->getData())
);

“其他扩展”(我假设你指的是另一个扩展的观察者对象)可能正在侦听一个不同的事件,一个将customer对象传递给事件的事件。例如,请考虑customer_login事件。

#File: app/code/core/Customer/Model/Session.php
public function setCustomerAsLoggedIn($customer)
{
    $this->setCustomer($customer);
    Mage::dispatchEvent('customer_login', array('customer'=>$customer));
    return $this;
}

此处事件派发包括客户对象

array('customer'=>$customer)

这意味着客户将在您的观察者中可用。