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');
}

浙公网安备 33010602011771号