# 路由设置
### 一、yaf路由的组成:
路由器:负责路由匹配的组件(一个应用只有一个)
路由协议:路由匹配规则(一个应用可以对应多个不同类型的规则)
### 二、路由器
1、作用:添加路由协议(路由规则)
2、主要方法:
**(1)添加路由**
添加路由一般在初始化启动应用的时候设置(Bootstrap.php中)
添加一个新的路由:addRoute(如例1)
批量添加路由(即添加路由配置):addConfig(如例2)
**例1:给文档分类添加分类路由**
博客分类默认的地址可能是:[http://www.kancloud.cn/category?categoryName=php](http://www.kancloud.cn/category?categoryName=php)
我们将它变成:[http://www.kancloud.cn/category/php](http://www.kancloud.cn/category/php)
~~~
$route = new \Yaf_Route_Rewrite(
"/category/:categoryName",
array(
"controller" => "product",
"action" => "category",
)
);
$router->addRoute('postCategory', $route);
~~~
**2:给文档详情页添加一个路由(当然配置可以是多条的)**
文档默认的地址可能是:[http://www.kancloud.cn/posts/detail?id=122](http://www.kancloud.cn/posts/detail?id=122)
注:这篇文档的ID为122
我们为了SEO优化可能把文档详情页地址换一下:[http://www.kancloud.cn/posts/detail/22](http://www.kancloud.cn/posts/detail/22)
首先,在项目配置文件app.ini添加相关的配置:
~~~
routes.postDetail.type="rewrite"
routes.postDetail.match="/posts/detail/:item"
;routes.postDetail.route.module=index
routes.postDetail.route.controller=posts
routes.postDetail.route.action=detail
~~~
其次,在项目启动文件bootstrap.php中添加新的路由配置(添加\_initRoute方法):
~~~
/**
* 初始化路由
*/
public function _initRoute(Yaf_Dispatcher $dispatcher)
{
$dispatcher->catchException(true);
$router = $dispatcher->getRouter();
$router->addConfig(\Config::get['routes']);
}
~~~
**(2)获取路由对象**
一般在初始化启动应用的时候获取,一般很少使用
获取路单个路由:getRoute:通过名称获取路由内容
获取所有设置的路由:getRoutes:返回所有路由配置,默认只有Yaf\_Route\_Static
目前yaf有6种自带的路由协议,当然,你也可以自定义协议(以下是按照使用的频度排序的)
1、Yaf\_Route\_Static:默认路由
如:[http://www.kancloud.cn/admin/posts/search?title=php](http://www.kancloud.cn/admin/posts/search?title=php)
* * ?作为查询字符串的标识与分隔点,?前端的为模块、控制器、方法部分,?后面为查询字符串参数部分
* * 如果有模块,必须指明模块(除了默认的index模块)
2、Yaf\_Route\_Rewrite:Rewrite路由
如本文第二部分中的例子
3、Yaf\_Route\_Regex:正则路由
通过正则表达式来作为路由规则,以补充rewrite路由的不足
如:商品的详情页:[http://item.mall.com/item/123](http://item.mall.com/item/123)
假如它原来的地址是:[http://item.mall.com/goods/item?id=123](http://item.mall.com/goods/item?id=123)
在bootstrap.php添加配置:
~~~
/**
* 初始化路由
*/
public function _initRoute(Yaf_Dispatcher $dispatcher)
{
$dispatcher->catchException(true);
$router = $dispatcher->getRouter();
$route = new \Yaf_Route_Regex('#^/item/([a-zA-Z-_0-9]+)#', array(
'controller'=>'goods',
'action'=>'item'
), array(1=>'id'));
$router->addRoute('goodsDetail', $route);
}
~~~
那么我们在Goods.php中的item方法中可以这样写:
~~~
<?php
class GoodsController extends Yaf_Controller_Abstract
{
public function itemAction()
{
var_dump($this->getRequest()->getParam('id'));
}
}
~~~
或者在配置文件app.ini添加如下的配置:
~~~
routes.itemDetail.type="regex"
routes.itemDetail.match="#^/item/([0-9]+)#"
;routes.itemDetail.route.module=index
routes.itemDetail.route.controller=goods
routes.itemDetail.route.action=item
routes.itemDetail.map.1=id
~~~
注:这里的itemDetail为规则的名称
* type为使用的路由协议类型
* match为匹配的规则,如正则表达式
* route.module为匹配的模块名
* route.controller为匹配的控制器名
* route.action为匹配的模块名
* map.1表示正则或rewrite规则匹配的第一个参数的名称
4、Yaf\\Route\\Simple:简单路由
个人感觉这是最原始的路由,是没有经过美化的路由,形式如:[http://www.kancloud.cn/?m=admin&c=index&a=index](http://www.kancloud.cn/?m=admin&c=index&a=index)
当然也可以修改参数名称,比如module表示模块名,controller表示控制器名,action表示方法名,即http://www.kancloud.cn/?module=admin&controller=index&action=index
只需要在bootstrap.php中设置:
~~~
/**
* 初始化路由
*/
public function _initRoute(Yaf_Dispatcher $dispatcher)
{
$dispatcher->catchException(true);
$router = $dispatcher->getRouter();
$route = new \Yaf_Route_Simple('module', 'controller', 'action');
$router->addRoute('goodsDetail', $route);
}
~~~
5、Yaf\\Route\\Supervar:static路由与simple路由的结合体
其形式为[http://www.kancloud.cn/?s=/admin/index/index/name/value](http://www.kancloud.cn/?s=/admin/index/index/name/value)
和Thinkphp框架的路由很类似,当然这个参数名s也是可以修改的
都需要在bootstrap.php中,添加如下配置:
~~~
/**
* 初始化路由
*/
public function _initRoute(Yaf_Dispatcher $dispatcher)
{
$dispatcher->catchException(true);
$router = $dispatcher->getRouter();
$route = new \Yaf_Route_Supervar('s');
$router->addRoute('myRoute', $route);
}
~~~
6、Yaf\_Route\_Map:指定方法与参数分隔符的路由
Yaf\_Route\_Map议是一种简单的路由协议, 它将REQUEST\_URI中以'/'分割的节, 组合在一起, 形成一个分层的控制器或者动作的路由结果. Yaf\_Route\_Map的构造函数接受俩个参数, 第一个参数表示路由结果是作为动作的路由结果,还是控制器的路由结果. 默认的是动作路由结果. 第二个参数是一个字符串, 表示一个分隔符, 如果设置了这个分隔符, 那么在REQUEST\_URI中, 分隔符之前的作为路由信息载体, 而之后的作为请求参数.
~~~
<?php
/**
* 对于请求request_uri为"/ap/foo/bar"
* base_uri为"/ap"
* 则最后参加路由的request_uri为"/foo/bar"
* 然后, 通过对URL分段, 得到如下分节
* foo, bar
* 组合在一起以后, 得到路由结果foo_bar
* 然后根据在构造Yaf_Route_Map的时候, 是否指明了控制器优先,
* 如果没有, 则把结果当做是动作的路由结果
* 否则, 则认为是控制器的路由结果
* 默认的, 控制器优先为FALSE
*/
~~~
详细路由可以参考官方文档:[http://www.laruence.com/manual/yaf.routes.static.html](http://www.laruence.com/manual/yaf.routes.static.html)
- 序言
- 安装 Yaf
- Yaf基础知识
- 1.运行流程
- 2.YAF架构
- 3.目录结构
- 4.Yaf的配置
- 5.Yaf的Bootstrap
- 6.Yaf的多模块配置
- 7.Yaf中使用命名空间
- 本书框架配置
- 1.框架目录结构
- 2.数据库配置
- 3.缓存配置
- 4.全局配置
- 5.公共助手函数
- 请求与响应
- 1.请求-Request
- 2.响应-Response
- 数据库操作
- 使用think-orm
- 接口开发
- 1.RESTful接口设计
- 2.Yar RPC接口设计
- 数据验证
- 数据验证 - validate
- 网页开发
- Session
- Cookie
- 路由设置
- 工具类
- 1.Rsa加密
- 2.Random快速生成随机数
- 3.Cache - 缓存
- 4.Weapp - 微信小程序类
- 5.Qiniu - 七牛云存储使用
- 6.支付类(微信&支付宝)
- 7.Logs - 日志记录