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

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

    /**
     * Retrieve Controller instance by ClassName
     *
     * @param string $class
     * @param Mage_Core_Controller_Request_Http $request
     * @param Mage_Core_Controller_Response_Http $response
     * @param array $invokeArgs
     * @return Mage_Core_Controller_Front_Action
     */
    public static function getControllerInstance($class, $request, $response, array $invokeArgs = 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 string $controllerClassName
     * @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类了 这种反人类的做法会不会是我想多了,本文也是为写而写了,实际应用中不建议做这种操作。有错误请帮忙指出。

评论

您的电子邮箱地址不会被公开。 必填项已用*标注

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>