我如何覆盖Mage_Core_Controller_Request_Http

时间:2012-02-08 19:11:55

标签: magento controller override

我对Mage_Core_Controller_Request_Http进行了一些更改,但是在使用magento分发的文件中。这不是最好的方法,我知道,但我还没有弄清楚如何覆盖Controller目录中的文件。我可以找到如何覆盖controllers目录中的文件。

任何人都可以告诉我如何在我自己的扩展中覆盖Mage_Core_Controller_Request_Http。

感谢

3 个答案:

答案 0 :(得分:9)

如果您不想恢复到包含路径hack,还可以使用反射在Mage_Core_Model_App模型上设置自己的请求类。您可以使用controller_front_init_before事件的观察者。
我假设您熟悉如何创建事件观察器,所以我只会添加观察者方法的代码。如果您需要其他信息,请询问。

// Observer method
public function controllerFrontInitBefore(Varien_Event_Observer $observer)
{
    $app = Mage::app();
    $reflection = new ReflectionClass($app);
    $property = $reflection->getProperty('_request');
    $property->setAccessible(true);
    $myRequest = new Your_Module_Controller_Request_Http();
    $myRequest->setOrigRequest($app->getRequest()); // if needed
    $property->setValue($app, $myRequest);

    // Proof of concept:
    // Loggs Your_Module_Controller_Request_Http
    Mage::log(get_class(Mage::app()->getRequest()));
}

创建课程Your_Module_Controller_Request_Http并扩展原始Mage_Core_Controller_Request_Http 在该事件之后,将使用您的请求对象而不是原始请求对象。

这使您可以尽可能保持升级安全,因为您不必从corcode池中复制完整的类。

答案 1 :(得分:5)

编辑:Vinai的解决方案更好。

因为这个类是直接实例化的,所以你必须使用所谓的 include path hack 来覆盖。

Varien_Autoload中设置了影响app/Mage.php工作的包含路径的优先顺序。该命令如下:

  1. app/code/local/
  2. app/code/community/
  3. app/code/core/
  4. lib/
  5. 因此,如果您将文件复制到localcommunity代码池下的类似路径,则将使用该类的定义。

答案 2 :(得分:2)

自Magento 1.7起,您可以使用方法Mage::app()->setRequest($request)替换Vinai建议的controller_front_init_before事件的观察者中的请求对象。

Magento Enterprise的警告:整页缓存不适用于此方法,因为它依赖于controller_front_init_before之前完成的请求对象的更改。您需要手动将旧请求中的所有属性复制到新请求 - 或者使用benmarks solution替换请求类。