ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
在说路由之前我们先看一张yaf的整体流程图如下: ![](https://box.kancloud.cn/2015-11-27_565806848c35f.png) #### 简单的理解 就我的理解来说,路由分发过程的执行动作是,获取用户请求的URl,根据路由规则解析这个URL,得到module、controller、action、param、query,根据获得的module和controller去载入控制器,执行对应的action方法。 #### 插件钩子 路由器也有插件钩子,就是routerStartup和routerShutdown,他们在路由解析前后分别被调用. ### 设置路由的方法 #### 1、先添加配置 > routes.regex4.type="regex" routes.regex4.match="#^/news/([^/]*)/([^/]*)#" routes.regex4.route.controller=news routes.regex4.route.action=detail routes.regex4.map.1=id routes.regex4.map.2=sort #### 2、在Bootstap.php中添加路由配置 `<?php class Bootstrap extends Yaf_Bootstrap_Abstract{ public function _initRoute(Yaf_Dispatcher $dispatcher) { $router = Yaf_Dispatcher::getInstance()->getRouter(); $router->addConfig(Yaf_Registry::get("config")->routes); } }` #### 3、添加接收的控制器 `<?php class NewsController extends Yaf_Controller_Abstract { public function init() { Yaf_Dispatcher::getInstance()->disableView(); } public function detailAction($id = 0,$sort = '') { print_r($this->getRequest()->getParams()); echo 'News Detail:'.$id.',sort:'.$sort; } } ?>` #### 4、访问url: yourhost/news/78/create_time 当访问这个url,yaf先根据我们的路由规则解析出默认的module,news控制器,detailAction,第一个参数id,第二个参数,sort。 #### 我们来分析一下解析流程: Yaf_Application::app()->bootstrap()->getDispatcher->dispatch(); 1.在yaf_dispatcher_route中,完成路由解析,得到module='',controller=news,action=detail 2.在yaf_dispatcher_fix_default中,通过其处理得到module=index,controller=news,action=detail 3.在2中完成之后,通过如果有hook机制,就会执行插件钩子:routerShutdown 4.在yaf_internal_autoload中完成自动加载类文件,application/controllers/News.php 5.执行detailAction ### 在Bootstrap.php中配置路由规则 上面就是一个简单的通过正则的方式来设置路由的示例,我们还可以直接在Bootstrap.php添加我们的路由规则: ` public function _initRoute(Yaf_Dispatcher $dispatcher) { $router = Yaf_Dispatcher::getInstance()->getRouter(); $router->addConfig(Yaf_Registry::get("config")->routes); //在刚才的示例里添加上下面两行 $route = new Yaf_Route_Simple("m", "c", "a"); $router->addRoute("simple", $route); }` #### 测试一下 我们就可以尝试用 yourhost?c=news&a=detail 访问你的newsController,detailAction了。 ### Yaf_Route_Simple 上面是Yaf_Route_Simple的一个示例 Yaf_Route_Simple是基于请求中的query string来做路由的, 在初始化一个Yaf_Route_Simple路由协议的时候, 我们需要给出3个参数, 这3个参数分别代表在query string中Module, Controller, Action的变量名,它也可以直接在配置信息里设置 > routes.simple.type="simple" routes.simple.controller=c routes.simple.module=m routes.simple.action=a 更多关于路由的信息可以参见官方文档:http://www.laruence.com/manual/yaf.routes.static.html