🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 路由设置 ### 一、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)