首先,正常人类是不会这么操作的。当然了,特殊的情况还是会存在的。 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类了 这种反人类的做法会不会是我想多了,本文也是为写而写了,实际应用中不建议做这种操作。有错误请帮忙指出。