magento - 为什么我的 Magento 观察者陷入无限循环?

标签 magento observer-pattern

我的观察者陷入了无限循环。为什么会发生这种情况以及如何解决它?

config.xml:

<?xml version="1.0"?>
<config>
    <global>
        <models>
            <shipmentsave>
                <class>Company_Shipmentsave_Model</class>
            </shipmentsave>
        </models>
    </global>
    <adminhtml>
        <events>
            <sales_order_shipment_track_save_after>
                <observers>
                    <shipmentsave>
                        <type>model</type>
                        <class>shipmentsave/observer</class>
                        <method>salesOrderShipmentTrackSaveAfter</method>
                    </shipmentsave>
                </observers>
            </sales_order_shipment_track_save_after>
            <sales_order_shipment_save_after>
                <observers>
                    <shipmentsave>
                        <type>model</type>
                        <class>shipmentsave/observer</class>
                        <method>salesOrderShipmentSaveAfter</method>
                    </shipmentsave>
                </observers>
            </sales_order_shipment_save_after>
        </events>
    </adminhtml>
    <frontend>
        <events>
            <sales_order_shipment_save_after>
                <observers>
                    <shipmentsave>
                        <type>singleton</type>
                        <class>shipmentsave/observer</class>
                        <method>salesOrderShipmentSaveAfter</method>
                    </shipmentsave>
                </observers>
            </sales_order_shipment_save_after>
        </events>
    </frontend>
</config>

Observer.php:

class Company_Shipmentsave_Model_Observer
{
    public function salesOrderShipmentSaveAfter(Varien_Event_Observer $observer)
    {
        error_log("My observer called ....",0);
        $shipment = $observer->getEvent()->getShipment();
        $order = $shipment->getOrder();
        $track = Mage::getModel('sales/order_shipment_track')
            ->setNumber('1231354564')
            ->setCarrierCode('localdelivery')
            ->setTitle('Aramex');
        $shipment->addTrack($track);
        $shipment->save();
        return;
    }
}

最佳答案

您的观察者等待保存货件,然后保存货件,这会导致它接收另一个事件 (yadda yadda ad nauseum)。您需要一种方法来摆脱循环或不必保存货件。

您能否将事件移至 sales_order_shipment_save_before,然后允许正常的发货保存生效,或者您是否需要已经保存发货才能完成您的部分逻辑?

如果是这样,请更改观察者上的以下行,以便 Magento 将其用作单例:

<type>singleton</type> // changed from model

然后,在您的类中创建一个变量来跟踪您是否已经递归。如果是这样,那么就返回。

或者,您可以检查货件上是否已有任何跟踪号码,只有在没有的情况下才保存(并且您添加了一个)。这也会终止递归。

请告诉我其中一个是否适合您。

谢谢, 乔

关于magento - 为什么我的 Magento 观察者陷入无限循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3164800/

相关文章:

Magento:以编程方式创建与分组产品相关的产品

php - DigitalOcean 服务器上的 Magento

magento - 通过 Google 获取仅显示 "q"

c++ - 通过 boost 信号 2 的观察者模式

objective-c - Cocoa 中的目录数据变化观察者

magento - 如何删除 Magento 自定义订单状态

css - 启用 SSL 后,Magento 自定义主题/包 CSS 无法正常工作

java - 我应该在 Web 应用程序的 Java bean 中添加对 PropertyChangeSupport 和 PropertyChangeListener 的支持吗?

java - 为什么这个观察者在运行时不更新?

objective-c - 在 Cocoa 中为进程添加观察者