Magento的路由系统,需要考虑到两个抽象层。

1,首先你需要了解,可能会有无数多个路由对象负责处理路由逻辑,最后只有一个路由对象能够获取并处理该请求。默认情况下,Magento拥有四个路由对象。

2,在这四种路由对象内,又有一系列不同的规则用于匹配url地址到相应的控制器方法。这些规则非常相似,只有一些细微的差别。


路由匹配迭代过程
Magneto的路由开始于前端控制器对象的Mage_Core_Controller_Varien_Front::dispatch()方法,在如下循环中,选择合适的路由对象,

while (!$request->isDispatched() && $i++<100) {foreach ($this->_routers as $router) {if ($router->match($this->getRequest())) {break;}}
}
Mage_Core_Controller_Varien_Front::$ _routers是前端控制器类的一个属性,
用于存放系统中可用的路由规则。该属性被定义为一个数组,
默认为空,数组键为路由对象表示,如admin,standard,cms,default,
对应的数组值分别为实例化的路由对象。
那么它是如何被系统赋值的呢?在系统APP模型中实例化前端控制器类的时候,
调用了该类的init()方法,该方法按照一定的方式,
实例化系统中可用的路由对象,并通过addRouter()方法,
将获取到的路由对象赋值给$_routers数组,
另外,在addRouter()中,每个路由对象都通过setFront()方法,获得了前端控制器的引用。





public function addRouter($name, Mage_Core_Controller_Varien_Router_Abstract $router)
{$router->setFront($this);$this->_routers[$name] = $router;return $this;
}

回过头来在看init()方法,下面是该方法的完整代码,

public function init()
{Mage::dispatchEvent('controller_front_init_before', array('front'=>$this));$routersInfo = Mage::app()->getStore()->getConfig(self::XML_STORE_ROUTERS_PATH);/*  $routersInfo需要的config.xml文件节点如下<web><!-- ... --><routers><admin><area>admin</area><class>Mage_Core_Controller_Varien_Router_Admin</class></admin><standard><area>frontend</area><class>Mage_Core_Controller_Varien_Router_Standard</class></standard></routers><!-- ... --></web>*/Varien_Profiler::start('mage::app::init_front_controller::collect_routers');foreach ($routersInfo as $routerCode => $routerInfo) {if (isset($routerInfo['disabled']) && $routerInfo['disabled']) {continue;}if (isset($routerInfo['class'])) {$router = new $routerInfo['class'];if (isset($routerInfo['area'])) {$router->collectRouters($routerInfo['area'], $routerCode);}$this->addRouter($routerCode, $router);}}Varien_Profiler::stop('mage::app::init_front_controller::collect_routers');//这里实际上分发事件,为了添加CMS路由对象Mage::dispatchEvent('controller_front_init_routers', array('front'=>$this));// 最后添加默认路由$default = new Mage_Core_Controller_Varien_Router_Default();$this->addRouter('default', $default);return $this;
}

如上所述,该方法只用于收集可用路由,并使用addRouter()方法添加路由对象到属性Mage_Core_Controller_Varien_Front::$_routers中。稍微深入点的话,可以看到,在foreach循环中,每次实例化路由时,都会调用路由对象的collectRouters()方法。该方法可以在standard路由对象中一探究竟。

11. Magento路由分发过程解析(一):在前端控制器中获取路由对象相关推荐

  1. 前端路由||路由的基本概念与原理||在开发中,路由分为:   后端路由   前端路由

    前端路由 路由的基本概念与原理 vue-router的基本使用 vue-router嵌套路由 vue-router动态路由匹配 vue-router命名路由 vue-router编程式导航 基于vue ...

  2. java路由分发_Java Springboot 整合RabbitMQ(四):路由(Routing)-B2B2C小程序电子商务...

    在本文中,我们将实现另一个功能 -- 只订阅一部分消息.例如,我们只需要把严重的错误日志信息写入日志文件(存储到磁盘),但同时仍然把所有的日志信息输出到控制台中 绑定(Binding) 在之前的例子中 ...

  3. 前端路由的原生代码实现?前端如何监听路由变化?

    前端如何监听路由的变化?如何根据前端路由的变化,去操作相应的DOM? 本文从前端层面上,大致解读一下,前端路由的监听与相关DOM操作的方法. 实现的基本原理: 首先,放置指定的DOM标识, 其次,当锚 ...

  4. vue路由跳转权限_如何在vue中实现路由跳转判断用户权限功能?

    实现这类校验有几个步骤. 1.设置路由是否需要校验的阀值. // 路由配置的地方谁知阀值 routes:[ { name:'admin', path:'/admin', component:'..., ...

  5. vue 获取当前路由_VUE 在组件中 获取 路由信息

    一.核心代码 1.获取参数 this.$route.query.id this.$route.query 2.页面跳转 登录 3.方法跳转 this.$router.push({ path: '/lo ...

  6. Django讲课笔记07:设置路由分发规则

    文章目录 零.本讲学习目标 一.课程导入 (一)复习 (二)路由 二.新课讲授 (一)设置路由分发规则 1.创建应用的路由文件(子路由) - urls.py (1)创建index应用的路由文件 (2) ...

  7. 母婴商城设置路由分发规则

    (1)创建index应用的路由文件 (2)创建commodity应用的路由文件 (3)创建shopper应用的路由文件 2.配置项目的路由文件(主路由) - urls.py (1)定义项目的路由集合 ...

  8. Flask路由分发及转换器

    引言 本文重点介绍,Flask路由分发及访问静态资源. 路由分发 app.route 装饰器的作用是将路由映射到视图函数,从浏览器输入对应的 url 地址,Flask程序,就会根据 url 找到对应的 ...

  9. Android事件分发完全解析之事件从何而来

    尊重原创转载请注明:From AigeStudio(http://blog.csdn.NET/aigestudio)Power by Aige 侵权必究! 炮兵镇楼 上一节Android事件分发完全解 ...

  10. jango专栏 07.路由分发

    07.路由分发 [toc]{type: "ol", level: [2, 3, 4, 5]} 路由分发 Django的每个应用都可以有自己的templates文件夹.django文 ...

最新文章

  1. VC/MFC Tips
  2. 浪潮的加班标语炸了,这是顶风作案?网传:1月加班87小时还要扣工资?
  3. matlab检验两个样本的,两样本独立T检验MATLAB代码
  4. sql语句性能优化【转载】
  5. 面试官:不使用synchronized和lock,如何实现一个线程安全的单例?
  6. CS 期刊哪家强?CCF 发布最新期刊分级目录!
  7. PC端 java 开发蓝牙所遇到的问题
  8. 48页PPT|小米用户画像实战,每页都是经典
  9. C#生成Excel出现8000401a的错误的另一种解决办法。
  10. ReentrantLock和AbstractQueuedSynchronizer的整体结构
  11. c语言小鱼的游泳时间,小鱼系列简单题参考代码
  12. 异构网络互联;路由与转发;SDN基本概念;拥塞控制
  13. axure下移固定地方_axure固定元件位置 教程:使用axure动态面板制作一个返回顶部的按钮...
  14. python软件长什么样子图片高清_手把手:扫描图片又大又不清晰?这个Python小程序帮你搞定!...
  15. 线上引流推广渠道有哪些,哪个效果好,企业应该怎么做?
  16. 长方形图片html圆形,css实现圆角矩形、半圆、圆形效果—border-radius使用详解
  17. 关于“硬件工程师工资不高”的几个真相
  18. java基础提升(六):缓冲流、转换流、序列化流、打印流
  19. Opencv3笔记18——重映射
  20. C#托管代码和非托管代码

热门文章

  1. 《探索需求》——阅读笔记三
  2. iOS8新建一个新的空白工程
  3. Linux 系统启动
  4. 【原创文章】通过英文电影突破英语
  5. 用R解析Mahout用户推荐协同过滤算法(UserCF)
  6. 99.9%的数据分析师,都做不到这些
  7. 一个文科小白的数据分析师之路
  8. PHP移动互联网开发笔记(6)——MySQL数据库基础回想
  9. SaltStact自动化运维工具03
  10. logrotate日志管理工具