Magento从当前控制器中获取另外一个控制器中的方法

首先,正常人类是不会这么操作的。当然了,特殊的情况还是会存在的。 Mage.php 文件里面 实例化类的方法 getControllerInstance

    /**
     * Retrieve Controller instance by ClassName
     *
     * @param string class
     * @param Mage_Core_Controller_Request_Httprequest
     * @param Mage_Core_Controller_Response_Http response
     * @param arrayinvokeArgs
     * @return Mage_Core_Controller_Front_Action
     */
    public static function getControllerInstance(class,request, response, arrayinvokeArgs = array())
    {
        return new class(request, response,invokeArgs);
    }

这里我们用下面代码获取控制器类的时候会报错

Fatal error: Class 'Mage_Customer_AccountController' not found

$controller = Mage::getControllerInstance('Mage_Customer_AccountController', null, null);

原因是没有加载这个Mage_Customer_AccountController类的php文件。 现在先看看路由的时候怎么加载控制器的Class 的 Mage_Core_Controller_Varien_Router_Standard

public function match(Zend_Controller_Request_Http request){
            ...controllerClassName = this->_validateControllerClassName(realModule, controller);
            if (!controllerClassName) {
                continue;
            }

        // instantiate controller class
        controllerInstance = Mage::getControllerInstance(controllerClassName, request,front->getResponse());
        ...
}

到了_validateControllerClassName()里面的 _includeControllerClass 才具体include 控制器类文件

    /**
     * Include the file containing controller class if this class is not defined yet
     *
     * @param string controllerFileName
     * @param stringcontrollerClassName
     * @return bool
     */
    protected function _includeControllerClass(controllerFileName,controllerClassName)
    {
        if (!class_exists(controllerClassName, false)) {
            if (!file_exists(controllerFileName)) {
                return false;
            }
            include controllerFileName;

        if (!class_exists(controllerClassName, false)) {
            throw Mage::exception('Mage_Core', Mage::helper('core')->__('Controller file was loaded but class does not exist'));
        }
    }
    return true;
}

到这里就很明了了。Magento从当前控制器中获取另外一个控制器中的方法就是得先include其他控制的类php文件,后面就是操作一个php类了 这种反人类的做法会不会是我想多了,本文也是为写而写了,实际应用中不建议做这种操作。有错误请帮忙指出。