kohana中的路由规则

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

在bootstrap.php文件中:

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

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


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

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

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

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

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

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

[php]  view plain  copy
  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 plain  copy
  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 plain  copy
  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 plain  copy
  1. class Controller_Frame extends Controller_Template {  
  2.       
  3.     public $template = 'template';  
  4.       
  5.     // Routes  
  6.     protected $media;  
  7.       
  8.     public function before(){  
  9.         parent::before();  
  10.           
  11.         if ($this->request->action() === 'media'){  
  12.             $this->auto_render = FALSE;  
  13.         }else {  
  14.             $this->media = Route::get('frame/media');  
  15.         }  
  16.     }  
  17.       
  18.       
  19.     public function after(){  
  20.         if ($this->auto_render){  
  21.             $media = Route::get('frame/media');  
  22.               
  23.             //Add styles  
  24.             $this->template->styles = array(  
  25.                 $media->uri(array('file' => 'skins/global.css')) => 'screen',  //加载  /media/www/skins/global.css  
[php]  view plain  copy
  1.             );  
  2.               
  3.             //Add scripts  
  4.             $this->template->scripts = array(  
  5.                 //$media->uri(array('file'=>'script/common.js'));  
  6.             );  
  7.         }  
  8.           
  9.         parent::after();  
  10.     }  
  11.   
  12. // End Welcome  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值