Magento初始化之路由篇

最终会进到Mage_Core_Controller_Varien_Front中来,执行dispatch方法

 while (!$request->isDispatched() && $i++ < 100) {
            foreach ($this->_routers as $router) {
                /** @var $router Mage_Core_Controller_Varien_Router_Abstract */
                if ($router->match($request)) {
                    break;
                }

            }
        }

 Mage::dispatchEvent('controller_front_send_response_before', array('front'=>$this));
        Varien_Profiler::start('mage::app::dispatch::send_response');
        $this->getResponse()->sendResponse();
        Varien_Profiler::stop('mage::app::dispatch::send_response');
        Mage::dispatchEvent('controller_front_send_response_after', array('front'=>$this));
        return $this;

其中$this->_routers为数组,对应的控制器有
Mage_Core_Controller_Varien_Router_Admin
Mage_Core_Controller_Varien_Router_Standard
Mage_Cms_Controller_Router
Mage_Core_Controller_Varien_Router_Default


如果你的网站的地址是:http://magento.com,在浏览中直接输入这个地址,则最终会访问Mage_Core_Controller_Varien_Router_Standard::match


//这里获取路径信息,即访问上面的地址的时候:$request->getPathInfo()为/
$path = trim($request->getPathInfo(), '/');
        if ($path) {
            $p = explode('/', $path);
        } else {
            $p = explode('/', $this->_getDefaultPath());
        }


//获取模块名,没有根据路径中第一部分取,这里的cms
 if ($request->getModuleName()) {
            $module = $request->getModuleName();
        } else {
            if (!empty($p[0])) {
                $module = $p[0];
            } else {
                $module = $this->getFront()->getDefault('module');
                $request->setAlias(Mage_Core_Model_Url_Rewrite::REWRITE_REQUEST_PATH_ALIAS, '');
            }
        }

//根据模块名获取此模块名关联的模块
$modules = $this->getModuleByFrontName($module);

这些module在哪里添加的呢,通过调用Mage_Core_Controller_Varien_Router_Standard:::addModule来初始化的

Mage_Core_Model_App->getFrontController
Mage_Core_Model_App->_initFrontController
Mage_Core_Controller_Varien_Front->init
Mage_Core_Controller_Varien_Router_Admin->collectRoutes
Mage_Core_Controller_Varien_Router_Standard->collectRoutes
Mage_Core_Controller_Varien_Router_Standard->addModule

共中Mage_Core_Controller_Varien_Front::init方法会初始化路由信息

//从配置文件获取路由配置信息,这块的代码后续在配置一节中讲解,具体配置在app/code/core/Mage/Core/etc/config.xml中
$routersInfo = Mage::app()->getStore()->getConfig(self::XML_STORE_ROUTERS_PATH);

        Varien_Profiler::start('mage::app::init_front_controller::collect_routers');
        foreach ($routersInfo as $routerCode => $routerInfo) {
            if (isset($routerInfo['disabled']) && $routerInfo['disabled']) {
                continue;
            }
           //创建相应的路由类,如果设置了area,则调用collectRouters方法
            if (isset($routerInfo['class'])) {
                $router = new $routerInfo['class'];
                if (isset($routerInfo['area'])) {
                    $router->collectRoutes($routerInfo['area'], $routerCode);
                }
                $this->addRouter($routerCode, $router);
            }
        }


回到Mage_Core_Controller_Varien_Router_Standard::match方法中,这个时候$modules只有Mage_Cms
接下来是遍历上面的模块了,分一块一块的代码讲吧

// 先获取控制器的名称,请求中没有设置,则取路径中第2部分,反之取默认
            if ($request->getControllerName()) {
                $controller = $request->getControllerName();
            } else {
                if (!empty($p[1])) {
                    $controller = $p[1];
                } else {
                    $controller = $front->getDefault('controller');
                    $request->setAlias(
                        Mage_Core_Model_Url_Rewrite::REWRITE_REQUEST_PATH_ALIAS,
                        ltrim($request->getOriginalPathInfo(), '/')
                    );
                }
            }

//接下来是获取action的名称,这里是index
if (empty($action)) {
                if ($request->getActionName()) {
                    $action = $request->getActionName();
                } else {
                    $action = !empty($p[2]) ? $p[2] : $front->getDefault('action');
                }
            }

//获取控制器的名称,这里是Mage_Cms_IndexController
$controllerClassName = $this->_validateControllerClassName($realModule, $controller);

//有相应的action,则跳出循环
if (!$controllerInstance->hasAction($action)) {
                continue;
            }

            $found = true;
            break;

 // 设置请求的控制器及action
        $request->setModuleName($module);
        $request->setControllerName($controller);
        $request->setActionName($action);
        $request->setControllerModule($realModule);

        // 设置url中一些参数到请求中
        for ($i = 3, $l = sizeof($p); $i < $l; $i += 2) {
            $request->setParam($p[$i], isset($p[$i+1]) ? urldecode($p[$i+1]) : '');
        }

        // 核心代码,分发action,即具体执行代码
        $request->setDispatched(true);
        $controllerInstance->dispatch($action);


//实际调用的是Mage_Cms_IndexController::indexAction,这里$pageId为home
$pageId = Mage::getStoreConfig(Mage_Cms_Helper_Page::XML_PATH_HOME_PAGE);
        //helper类为Mage_Cms_Helper_Page
     if (!Mage::helper('cms/page')->renderPage($this, $pageId)) {
            $this->_forward('defaultIndex');
        }

posted @ 2015-06-20 23:06  szphper  阅读(536)  评论(0)    收藏  举报