Php Magento:如果控制器被重写,为什么控制器操作预触发事件不会触发?

Php Magento:如果控制器被重写,为什么控制器操作预触发事件不会触发?,php,magento,event-handling,controller,extensibility,Php,Magento,Event Handling,Controller,Extensibility,如果控制器被重写,为什么控制器操作预触发事件不会触发?下面是store/app/code/core/Mage/core/Controller/Varien/Action.php的一个片段: abstract class Mage_Core_Controller_Varien_Action { // [...] public function preDispatch() { // [...] if ($this->_rewrite())

如果控制器被重写,为什么控制器操作预触发事件不会触发?下面是
store/app/code/core/Mage/core/Controller/Varien/Action.php
的一个片段:

abstract class Mage_Core_Controller_Varien_Action
{
    // [...]
    public function preDispatch()
    {
        // [...]
        if ($this->_rewrite()) {
            return; // [What is the purpose if this?]
        }
        // [...]

        // [This is where my event needs to be firing, but this code never gets 
        // executed because the controller is rewritten]
        Mage::dispatchEvent(
            'controller_action_predispatch_'.$this->getFullActionName(),
            array('controller_action'=>$this)
        );

    }
    // [...]
}

我不知道从哪里开始解决这个问题。有人曾经处理过这个问题吗?

嘿,我不确定(因为我不太熟悉Magento的内部工作),但我突然想到,
\u rewrite()
检查对这个特定操作的调用是否被重定向(以一种mod\u rewrite的方式重写)到不同的控制器/操作。在这种情况下,不触发原始操作的事件是有意义的,因为整个请求由不同的操作处理。

没有时间测试您描述的行为是否准确,但如果是这样的话,我想是在调用后,
\u rewrite
函数复制了其他非事件代码的操作,如果在重写后允许
preDispatch
继续,那么“坏事情”就会发生

换句话说,这是控制器重写实现中的一个被忽略的错误,因为处理这个问题的首选方法现在是。一般来说,当这样的系统级错误进入Magento时,它往往会停留在那里,因为当任何事情发生变化时,即使是错误修复,购物车所有者也会开始依赖于被破坏的行为并大声尖叫

如果您不能按照上面链接中的描述重新考虑您的解决方案,您仍然可以使用老式的面向对象编程在控制器类中自己触发事件。将以下内容添加到自定义控制器(要重写的控制器)


你甚至不能在magento中重写抽象模型?仅在本地/法师中整体替换它们?
protected function _rewrite()
{
    //call the parent rewrite method so every that needs
    //to happen happens
    $original_result = parent::_rewrite();

    //fire the event ourselve, since magento isn't firing it
    Mage::dispatchEvent(
        'controller_action_predispatch_'.$this->getFullActionName(),
        array('controller_action'=>$this)
    );      

    //return the original result in case another method is relying on it
    return $original_result;
}