yaf路由组件有两个部分:路由器(Yaf_Router)和路由协议(Yaf_Route_Abstract)
路由协议事实上主要负责匹配我们预先定义好的路由协议,意思就是我们只有一个路由器,但我们可以有许多路由协议. 路由器主要负责管理和运行路由链,它根据路由协议栈倒序依次调用各个路由协议, 一直到某一个路由协议返回成功以后, 就匹配成功,路由的过程发生派遣过程的最开始,并且路由解析仅仅发生一次.路由过程在何控制器动作(Controller, Action)被派遣之前被执行,一旦路由成功,路由器将会把解析出得到的信息传递给请求对象(Yaf_Request_Abstract object), 这些信息包括moduel、controller、action、用户params等. 然后派遣器(Yaf_Dispatcher)就会按照这些信息派遣正确的控制器动作. 路由器也有插件钩子,就是routeStartup和routeShutdown,他们在路由解析前后分别被调用.(摘自 yaf手册)
目录结构如下:
.
├── application
│ ├── actions
│ │ └── Index.php
│ ├── Bootstrap.php
│ ├── cache
│ │ └── templates_c
│ ├── controllers
│ │ ├── Com.php
│ │ ├── Error.php
│ │ ├── Index.php
│ │ ├── Net.php
│ │ └── Person.php
│ ├── library
│ │ ├── Config
│ │ ├── Db
│ │ │ ├── Base.php
│ │ │ ├── MultiTable.php
│ │ │ └── Table.php
│ │ ├── Smarty
│ │ │ ├── Adapter.bak.php
│ │ │ ├── Adapter.php
│ │ │ ├── debug.tpl
│ │ │ ├── debug.tpl.bak
│ │ │ ├── plugins
│ │ │ ├── SmartyBC.class.php
│ │ │ ├── Smarty.class.php
│ │ │ └── sysplugins
│ │ └── Sys
│ │ ├── Box.php
│ │ ├── Controller
│ │ ├── Filter.php
│ │ ├── Fun.php
│ │ ├── Local.php
│ │ ├── Mailer.php
│ │ ├── Memcache.php
│ │ ├── Mongodb.php
│ │ ├── Phpmailerexception.php
│ │ ├── Rest.php
│ │ └── Smarty.php
│ ├── models
│ │ └── Gongchanginfo
│ │ ├── gccompany.php~
│ │ ├── Gccompany.php
│ │ └── Gccompany.php~
│ ├── modules
│ │ └── User
│ │ ├── controllers
│ │ └── views
│ ├── plugins
│ │ └── Sample.php
│ └── views
│ ├── debug.tpl
│ ├── extends.html
│ ├── index.html
│ └── index.html~
├── cache
│ └── df73b85a38d155c75edced0ea40953d7cfc85c87.index.html.php
├── cli.php
├── conf
│ └── application.ini
├── index.php
├── src
│ ├── log.png
│ └── scc.js
├── templates_c
利用LNMP进行的测试,域名为:wwww.yaf.cn
1:默认路由
默认情况下,路由器是Yaf_Router,路由协议是Yaf_Route_Static,是基于HTTP路由的, 它期望一个请求是HTTP请求并且请求对象是使用Yaf_Request_Http
而Yaf_Router负责分析请求中的request uri, 在去除掉base_uri以后, 得出目标模板, 控制器, 动作.获取到真正的负载路由信息的request_uri片段, 具体的策略是, 根据"/"对request_uri分段, 依次得到Module,Controller,Action, 在得到Module以后, 还需要根据Yaf_Application::$modules来判断Module是否是合法的Module, 如果不是, 则认为Module并没有体现在request_uri中, 而把原Module当做Controller, 原Controller当做Action:
如果在配置文件application.ini的内容中为:
[common]
application.directory = APPLICATION_PATH"/application/"
application.dispatcher.catchException = True ;出错的时候是否抛出异常
application.dispatcher.catchException = True ;是否使用默认的异常捕捉
application.cache_config = 1
application.view.ext = "html"
application.modules = Index,User;声明存在的模块名
;application.library = local
;可以定义默认的module controller action
application.dispatcher.defaultModule = Index
application.dispatcher.defaultController = Index
application.dispatcher.defaultAction = index
如若访问:
www.yaf.cn 会调用 /application/controllers/下面的Index.php(文件名第一个字母大写)中的indexAction ,不过你可以通过修改application.dispatcher.defaultAction来修改默认调用Action
www.yaf.cn/user/index/index (必须保证user模块存在)解析的时候 发现user数模块名称index是控制器名称 index是Action名称就会调用 application/modules/User/下面的Index.php
2:Yaf_Route_Simple 路由
public function __initRoute(Yaf_Dispatcher $dispatcher){
//Yaf_Route_Simple 路由
$routeArr = new Yaf_Route_Simple('m','c','a');
$router->addRoute("name",$routeArr);
}
访问:www.yaf.cn/?m=user&c=account&a=add ( m 代表模块名称 c 代表控制器 a 代表Action m、c、a是可以修改为任意的字符的)
3:Yaf_Route_Supervar
Yaf_Route_Supervar和Yaf_Route_Simple相似, 都是在query string中获取路由信息, 不同的是, 它获取的是一个类似包含整个路由信息的request_uri
public function __initRoute(Yaf_Dispatcher $dispatcher){
//Yaf_Route_Supervar 路由
$routeArr = new Yaf_Route_Supervar('r');
$router->addRoute("name",$routeArr);
}
访问:http://www.yaf.cn/?r=/user/account/index
4:Yaf_Route_Regex 正则路由
在application.ini 中加入:
;正则路由
routes.regex_about.type = "regex"
routes.regex_about.match = "#^/about.html$#"
routes.regex_about.route.module = User
routes.regex_about.route.controller = Index
routes.regex_about.route.action = about
routes.regex_about.map.1 = name
访问:http://www.yaf.cn/about.html
5:Yaf_Route_Rewrite
public function __initRoute(Yaf_Dispatcher $dispatcher){
//创建一个路由协议实例
$route = new Yaf_Route_Rewrite('product/:ident',array('module'=>'User','controller' => 'Index','action' => 'test'));
//使用路由器装载路由协议
$router->addRoute('product', $route);
}
访问:http://www.yaf.cn/product/34
6:Yaf_Route_Map ??