状态 草稿
Todo Expand, add examples
官方最后更新时间 2008/11/10 15:05

路由(Routing)

通常情况下,一个URI将一对一映射到一个控制器类或者方法,在必要时并提供实参。例如,

http://www.example.com/class/function/arg1/arg2

第一分段是控制器类,第二分段是类的方法,其他分类则是方法中的参数。

事实上,无论如何,你想改变分段方法时,比如,你想使用这样的URIs:http://www.example.com/article/22。这里第二分段式文章的 ID 这是一个参数,不是控制器方法。那么使用 Kohana routes 的特性可以改变控制器和方法的 URIs 映射。

Kohana 路由配置

为了改变路由我们需要把 system/config 目录下的 routes.php 复制到 application/config 目录下面。

默认的 routes.php 文件是这样的:

$config['_default'] = 'welcome';

$config['_default'] 指定了默认的 route 。它是用来说明哪些控制器当URI没有包括参数而使用。例如,如果你的 Web 程序是地址是 http://www.example.com,当你访问这个链接时,如没有特别指定URI则会调用 welcome 控制器,效果和 http://www.example.com/welcome 是一样的。

自定义路由

当然除了系统默认的我们也可以自己制定路由,比如:

$config['route'] = 'class/method';

route 是你想要的URI时,你也可以使用自己的替换 class/method

举个例子,如果你的 Web 程序是地址是www.example.com,你设置的路由是:

$config['test'] = 'foo/bar';

那么当你访问 http://www.example.com/tst 是你想会看到访问 http://www.example.com/foo/bar 的效果。

使用正则表达式

路由(Route)还支持使用正则表达。 如果你对正则表达式不熟悉,你可以在 PHP 网站查阅相关资料。使用正则表达式,可以匹配更多的 URIs ,你可以利用子模式回到引用技术再重使用替换的 URI

下面是一个最好的例子。如果我们想要匹配类似这样的地址:http://www.example.com/article/22 ,我们应该使用下面的路由 :

$config['article/([0-9]+)'] = 'news/show/$1';

它将配对以 ‘article’ 开头后面跟着数字的URLs,对于这种格式的URL,将会采用 news 控制器,访问 show() 方法。article number 将作为 show() 方法的参数,在http://www.example.com/article/22中相当于访问 http://www.example.com/news/show/22

属性

下面有几个公开的 Router 类的属性,在实例化路由之后可以使用。

$current_uri

返回使用路由中 URL 的部分。例如,如果 URLhttp://localhost/welcome/index/var1?var2=2,那么返回

welcome/index/var1

如果 URLhttp://localhost/,则返回默认的路由。

$query_string

返回请求 URL 的部分,包含问号。

例如,如果 URLhttp://localhost/welcome?var1=1&var2=2,那么返回字符串

?var1=1&var2=2

$complete_uri

Return Router::$current_uri appended with Router::$query_string.

$routed_uri

通过路由 Router::$current_uri 返回定义的路由 URI。

默认路由配置 $routed_uri 将会匹配 $current_uri。如果你配置了路由

$config['test'] = 'foo/bar';

那么请求 URL http://localhost/test,这个默认返回的字符串就是

foo/bar

$url_suffix

如果在 config.php 中配置并使用在当前请求中则返回请求 URL 的后缀。

如果,你配置的 URL 后缀为 .html 且请求的 URLhttp://localhost/welcome.html,那么返回字符串

.html

$segments

使用 Router::$current_uri 返回当前 URL 分散后的分段到数组中。

例如,如果 Router::$current_uri 包含

welcome/index

分段,则返回数组

array('welcome', 'index');

$rsegments

使用 Router::$routed_uri 返回分散后的分段到数组中。

例如,如果 Router::$routed_uri 包含

welcome/index

分段,则返回数组

array('welcome', 'index');

$controller

返回请求路由的控制器名。

例如,一个名为 welcome 的控制器(类名:Welcome_Controller)被调用,不论如何请求路由,均返回字符串

welcome

它不包括控制器文件存在在任何子目录,只有控制器自身的名称。

$controller_path

例如,返回在控制器文件的绝对路径。例如,如果 Kohana 安装设置在 /var/www/ 目录中兵器一个名为 welcome 控制器会被调用,这时就会返回字符串

/var/www/application/controllers/welcome.php

$method

返回请求路由方法的名称。

例如,名为 welcome 的控制器中的 index 方法被调用,不论如何请求路由,均返回字符串

index

$arguments

返回 URL 分段去除控制器和方法之外的数组(即返回控制器方法中的参数)

例如,使用默认路由配置,当 URLhttp://localhost/welcome/index/var1/var2?var3=3&var4=4,则返回数组

array('var1', 'var2');

实例

general/routing.txt · 最后更改: 2008/11/10 21:56 由 icyleaf