kohana中的路由规则

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

在bootstrap.php文件中:

Route::set('default', '(<controller>(/<action>(/<id>)))')
	->defaults(array(
		'controller' => 'home',
		'action'     => 'index',
	));

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

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

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

/*
 * Authentication shortcuts
 */
Route::set('auth', '<action>',
  array(
    'action' => '(login|logout)'
  ))
  ->defaults(array(
    'controller' => 'auth'
  ));
 
/*
 * Multi-format feeds
 *   452346/comments.rss
 *   5373.json
 */
Route::set('feeds', '<user_id>(/<action>).<format>',
  array(
    'user_id' => '\d+',
    'format' => '(rss|atom|json)',
  ))
  ->defaults(array(
    'controller' => 'feeds',
    'action' => 'status',
  ));
 
/*
 * Static pages
 */
Route::set('static', '<path>.html',
  array(
    'path' => '[a-zA-Z0-9_/]+',
  ))
  ->defaults(array(
    'controller' => 'static',
    'action' => 'index',
  ));
 
/*
 * You don't like slashes?
 *   EditGallery:bahamas
 *   Watch:wakeboarding
 */
Route::set('gallery', '<action>(<controller>):<id>',
  array(
    'controller' => '[A-Z][a-z]++',
    'action'     => '[A-Z][a-z]++',
  ))
  ->defaults(array(
    'controller' => 'Slideshow',
  ));
 
/*
 * Quick search
 */
Route::set('search', ':<query>', array('query' => '.*'))
  ->defaults(array(
    'controller' => 'search',
    'action' => 'index',
  ));

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


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

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

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

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

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

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

Route::set('default', '(<controller>(/<action>(/<id>(/<params>))))', array('params'=>'.*'))
	->defaults(array(
		'controller' => 'home',
		'action'     => 'index',
	));

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

$params = $this->request->param('params');
$params = explode('/', $params);
$num = 0;
$count = count($params);
$param = array();
while ($num < $count){
	$param[$params[$num++]] = $params[$num++];
}


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

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

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

首先定义路由规则:

bootstrap.php

// Static file serving (CSS, JS, images)
Route::set('frame/media', 'media/www(/<file>)', array('file' => '.+'))
	->defaults(array(
		'controller' => 'frame',
		'action'     => 'media',
		'file'       => NULL,
	));


frame.php

class Controller_Frame extends Controller_Template {
	
	public $template = 'template';
	
	// Routes
	protected $media;
	
	public function before(){
		parent::before();
		
		if ($this->request->action() === 'media'){
			$this->auto_render = FALSE;
		}else {
			$this->media = Route::get('frame/media');
		}
	}
	
	
	public function after(){
		if ($this->auto_render){
			$media = Route::get('frame/media');
			
			//Add styles
			$this->template->styles = array(
				$media->uri(array('file' => 'skins/global.css')) => 'screen',  //加载  /media/www/skins/global.css
			);
			
			//Add scripts
			$this->template->scripts = array(
				//$media->uri(array('file'=>'script/common.js'));
			);
		}
		
		parent::after();
	}

} // End Welcome




  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
转于:http://www.bsdcn.com/ Kohana 文手册[情人节专版] 本手册为 Kohana Docs v2.2 版本。 本手册制作日期:2009年02月10日 本手册由 icyleaf 制作 --- 参考 常规(General) Kohana 文件系统(Filesystem) - 汉化度 100% 配置(Configuration) - 汉化度 100% URLs - 汉化度 100% 路由(Routing) - 汉化度 99% 加载资源(Loading) - 汉化度 100% 控制器(Controllers) - 汉化度 100% 库(Libraries) - 汉化度 100% 辅助函数(Helpers) - 汉化度 100% 视图(Views) - 汉化度 100% 模型(Models) - 汉化度 100% 事件(Events) - 汉化度 85% 钩子(Hooks) - 汉化度 100% 错误处理(Error Handling) - 汉化度 100% 模块(Modules) - 汉化度 100% 国际化(i18n) - 汉化度 100% 日志(Logging) - 汉化度 100% 核心类(Core) 基准测试类(Benchmark Class) - 汉化度 100% 事件类(Event Class) - 汉化度 100% Kohana 类 - 汉化度 100% Unicode 类 - 汉化度 100% 视图库(View Class) - 汉化度 100% 核心库(Libraries) 缓存库(Cache Library) - 汉化度 100% 日历库(Calendar Library) - 汉化度 95% 验证库(Captcha Library) - 汉化度 99% 数据库库(Database Library) - 汉化度 40% 加密库(Encrypt Library) - 汉化度 100% 图像库(Image Library) - 汉化度 20% 输入库(Input Library) - 汉化度 0% ORM 库 - 汉化度 100% 分页库(Pagination Library) - 汉化度 99% 分析库(Profiler Library) - 汉化度 100% Session 库 - 汉化度 100% URI 库 - 汉化度 99% 校验库(Validation Library) - 汉化度 99% 辅助函数(Helpers) 数组辅助函数 - 汉化度 100% Cookie 辅助函数 - 汉化度 98% 日期辅助函数 - 汉化度 100% 下载辅助函数 - 汉化度 100% Email 辅助函数 - 汉化度 100% Expires Helper - 汉化度 0% Feed 辅助函数 - 汉化度 100% 文件辅助函数 - 汉化度 100% 表单辅助函数 - 汉化度 45% HTML 辅助函数 - 汉化度 100% Inflector Helper - 汉化度 0% 数字辅助函数 - 汉化度 100% 请求辅助函数 - 汉化度 80% 安全性辅助函数 - 汉化度 100% 文本辅助函数 - 汉化度 20% 上传辅助函数 - 汉化度 100% URL 辅助函数 - 汉化度 100% 校验辅助函数 - 汉化度 8% 附加模块(Addons) Archive 扩展 - 汉化度 99% Auth 扩展 - 汉化度 100% Gmaps 扩展 - 汉化度 100% Kodoc 扩展 - 汉化度 100% Payment 扩展 - 汉化度 99%

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值