Kohana的路由规则是非常强大的。首先必须确认的是路由的匹配原则是有顺序,当一条路由规则匹配成功时,就停止匹配,也就是说在其后面定义的路由规则将不再被执行,因此最后的一条路由规则几乎可以匹配所有的路由规则,它常常类似于下面这样:

在bootstrap.php文件中:

[php] view plaincopy
  1. Route::set('default', '(<controller>(/<action>(/<id>)))')
  2. ->defaults(array(
  3. 'controller' => 'home',
  4. 'action'     => 'index',
  5. ));

首先需要明白这些语句的含义。

这条路由的名字叫"default";定义了三个路由键,“controller”、“action”、"id".这三个路由键都不是必须的(因为他们都包含在括号里面。),尖括号里面的值就是路由键的名字。如果输入的url中没有controller将默认的controller是home。路由键的名字可以随便命名,但是“directory”、'controller'、‘action’具有特殊的用意,他们定义了使用哪个controller的那个action,directory定义了controller所在的文件目录。

在路由中我们可以定义正则来限制路由所能匹配的范围。下面的例子是kohana手册中的一些例子,比较实用:

[php] view plaincopy
  1. /*
  2. * Authentication shortcuts
  3. */
  4. Route::set('auth', '<action>',
  5. array(
  6. 'action' => '(login|logout)'
  7. ))
  8. ->defaults(array(
  9. 'controller' => 'auth'
  10. ));
  11. /*
  12. * Multi-format feeds
  13. *   452346/comments.rss
  14. *   5373.json
  15. */
  16. Route::set('feeds', '<user_id>(/<action>).<format>',
  17. array(
  18. 'user_id' => '\d+',
  19. 'format' => '(rss|atom|json)',
  20. ))
  21. ->defaults(array(
  22. 'controller' => 'feeds',
  23. 'action' => 'status',
  24. ));
  25. /*
  26. * Static pages
  27. */
  28. Route::set('static', '<path>.html',
  29. array(
  30. 'path' => '[a-zA-Z0-9_/]+',
  31. ))
  32. ->defaults(array(
  33. 'controller' => 'static',
  34. 'action' => 'index',
  35. ));
  36. /*
  37. * You don't like slashes?
  38. *   EditGallery:bahamas
  39. *   Watch:wakeboarding
  40. */
  41. Route::set('gallery', '<action>(<controller>):<id>',
  42. array(
  43. 'controller' => '[A-Z][a-z]++',
  44. 'action'     => '[A-Z][a-z]++',
  45. ))
  46. ->defaults(array(
  47. 'controller' => 'Slideshow',
  48. ));
  49. /*
  50. * Quick search
  51. */
  52. Route::set('search', ':<query>', array('query' => '.*'))
  53. ->defaults(array(
  54. 'controller' => 'search',
  55. 'action' => 'index',
  56. ));

上面的例子可以看出正确的使用路由可以做许多的事情,上面的例子有一些也比较夸张,例如那个使用大写字母来分离参数的例子我在本机上测试报错,最后search的例子也是报错,估计是服务器设置的问题,不能使用“:”。

路由的匹配是通过正则语法来匹配的。

路由规则中的‘/’就是为了说明各个参数之间是使用'/'来分割的。当然这条默认的路由规则并不能匹配所有的路由规则,比如下面的一条URL地址将会报错:

http://kohana.dev/home/index/123/key/value/key/value

也就是说这条路由规则只能匹配类似下面的这样的

http:kohana.dev/controller/action/id ,如在id的后面再加'/'后面再加参数就不能匹配了

我们可以使用这种方式来纠正这个问题,这种方法也叫做忽略路由溢出

[php] view plaincopy
  1. Route::set('default', '(<controller>(/<action>(/<id>(/<params>))))', array('params'=>'.*'))
  2. ->defaults(array(
  3. 'controller' => 'home',
  4. 'action'     => 'index',
  5. ));

这条路由规则将匹配类似“http://kohana.dev/home/index/123/key/value/key/value”这样的url,这时"params"这个路由值里面将是“key/value/key/value”;我们可以很方便的把这些键值分离出来,类似下面这样:

[php] view plaincopy
  1. $params = $this->request->param('params');
  2. $params = explode('/', $params);
  3. $num = 0;
  4. $count = count($params);
  5. $param = array();
  6. while ($num < $count){
  7. <span style="white-space:pre">  </span>$param[$params[$num++]] = $params[$num++];
  8. }

我们可以创建多个路由规则,前面已经说的路由规则是按照顺序匹配的,当找到一个匹配的规则时将会停止匹配,因此越是写在前面的路由规则就越严格,匹配的情况就应该越少,

在添加路由时要给其取一个唯一的名字,如果名字相同则后面的路由将覆盖前面的路由规则。从用户手册也可以看出,Kohana是鼓励用户使用多路由的。

下面是一个使用路由规则来加载静态文件(CSS,JS)的实例

首先定义路由规则:

bootstrap.php

[php] view plaincopy
  1. // Static file serving (CSS, JS, images)
  2. Route::set('frame/media', 'media/www(/<file>)', array('file' => '.+'))
  3. ->defaults(array(
  4. 'controller' => 'frame',
  5. 'action'     => 'media',
  6. 'file'       => NULL,
  7. ));

frame.php

[php] view plaincopy
  1. class Controller_Frame extends Controller_Template {
  2. public $template = 'template';
  3. // Routes
  4. protected $media;
  5. public function before(){
  6. parent::before();
  7. if ($this->request->action() === 'media'){
  8. $this->auto_render = FALSE;
  9. }else {
  10. $this->media = Route::get('frame/media');
  11. }
  12. }
  13. public function after(){
  14. if ($this->auto_render){
  15. $media = Route::get('frame/media');
  16. //Add styles
  17. $this->template->styles = array(
  18. $media->uri(array('file' => 'skins/global.css')) => 'screen',  //加载  /media/www/skins/global.css
[php] view plaincopy
  1. );
  2. //Add scripts
  3. $this->template->scripts = array(
  4. //$media->uri(array('file'=>'script/common.js'));
  5. );
  6. }
  7. parent::after();
  8. }
  9. } // End Welcome

kohana中的路由规则相关推荐

  1. Dubbo 路由规则之条件路由

    Dubbo 路由规则之条件路由 前言 大家好,今天开始给大家分享 - Dubbo 专题之 Dubbo 路由规则之条件路由.在前一个章节中我们介绍了 Dubbo 令牌验证和优雅停机,以及我们也例举了常见 ...

  2. Dubbo负载均衡和路由规则的区别

    点击关注强哥,查看更多精彩文章呀 哈喽,大家好,我是强哥. 大家知道,强哥之前有一篇推文Dubbo也支持基于应用粒度的服务发现机制啦中说到,Dubbo2.x版本目前大都还是使用接口粒度的服务发现机制. ...

  3. dubbo服务的集群扩展、目录服务、路由规则、负载均衡

    1. Cluster-集群扩展 当有多个服务提供方时,将多个服务提供方组织成一个集群,并伪装成一个提供方.已知的实现如下, 1-1. FailoverCluster(默认的) 失败转移,当出现失败,重 ...

  4. 示例Express中路由规则及获取请求参数

    本次给大家分享一篇基于express中路由规则及获取请求参数的方法,写的十分的全面细致,具有一定的参考价值,对此有需要的朋友可以参考学习下.如有不足之处,欢迎批评指正. express中常见的路由规则 ...

  5. Knative 实战:如何在 Knative 中配置自定义域名及路由规则

    作者 | 元毅 阿里云智能事业群高级开发工程师 当前 Knative 中默认支持是基于域名的转发,可以通过域名模板配置后缀,但目前对于用户来说并不能指定全域名设置.另外一个问题就是基于 Path 和 ...

  6. 编程实现路由算法 实验报告_lt;中国通信专刊gt; EARS:用于软件定义网络中自动路由的智能驱动体验网络架构...

    题目:EARS:用于软件定义网络中自动路由的智能驱动体验网络架构 摘要:软件定义网络(SDN)通过将控制平面与数据平面解耦来适应逻辑集中的控制,并提供对网络资源的有效利用.但是,由于传统路由策略依赖于 ...

  7. 聊聊服务治理中的路由设计

    前言 路由(Route)的设计广泛存在于众多领域,以 RPC 框架 Dubbo 为例,就有标签路由.脚本路由.权重路由.同机房路由等实现. 在框架设计层面,路由层往往位于负载均衡层之前,在进行选址时, ...

  8. thinkphp学习笔记10—看不懂的路由规则

    原文:thinkphp学习笔记10-看不懂的路由规则 路由这部分貌似在实际工作中没有怎么设计过,只是在用默认的设置,在手册里面看到部分,艰涩难懂. 1.路由定义 要使用路由功能需要支持PATH_INF ...

  9. LinuxC下获取UDP包中的路由目的IP地址和头标识目的地址

    在接受到UDP包后,有时候我们需要根据所接收到得UDP包,获取它的路由目的IP地址和头标识目的地址. (一)主要的步骤: 在setsockopt中设置IP_PKTINFO,然后通过recvmsg来获取 ...

最新文章

  1. MyEclipse设置默认的文档注释和背景色设置
  2. TCP滑动窗口 - 动画演示
  3. 【脚下有根】之Skia库的matrix代码解读
  4. [YTU]_2760( 字符串---首字母变大写)
  5. 十大应用在数学的计算机语言
  6. 在rac集群上开启OEM
  7. oracle技术之Oracle 物化视图(一)
  8. Android 仿知乎创意广告
  9. 安卓航班Android开发经典教程大总结1----基础编程及源码推送
  10. AndroidStudio_开发工具_调试功能---Android原生开发工作笔记75
  11. C Primer Plus 第8章 字符输入/输出和输入确认 8.11 编程练习答案
  12. springMVC之applicationcontext.xml配置说明
  13. 图像与矩阵_Python_No.3
  14. windows 界面设计规则与规范
  15. 摄影系列:单反相机入门知识
  16. 锐明部标视频设备和博实结设备对部标1078协议支持程度评测对比
  17. freeswitch借助fail2ban屏蔽骚扰注册
  18. windows系统运行uniapp到ios基座
  19. 设置了相对定位relative之后,改变top值,如何去掉多余空白?
  20. mysql查询出当前年份的12个月

热门文章

  1. TortoiseGit密钥的配置
  2. shell启动java_一个通用的java Application启动shell脚本
  3. python安装步骤图解-Python安装-小白图文教程(精)
  4. python代码基础题-python第一部分基础题1-80题
  5. python写小程序-用python写个简单的小程序,编译成exe跑在win10上
  6. python推荐书籍-7本经典的Python书籍,你都读过了么?
  7. python强大体现在哪些方面-什么python的if语句?它主要应用在哪些方面?
  8. python下载软件-python下载工具
  9. python编程零基础-如何零基础入门Python编程?
  10. 怎么自学python语言-怎样学好python