前提介绍
今天主要的说一下 Yaf 的路由机制,当然在这里在做一下小的广告,做了一个 C 语言PHP扩展的社区,有兴趣的朋友去注册一下,支持一下,然后有问题发一下。地址 www.weiduyun.com。
Yaf Router 基础
Yaf 的默认路由是 Router ,但是是使用路由协议对 URL 进行分发的,它接收的请求对象是
Yaf_Request_Http
,当你使用命名空间的时候就编程Yaf\Request_http
。默认的路由协议有如下几条:
Yaf_Route_Simple
Yaf_Route_Supervar
Yaf_Route_Static
Yaf_Route_Map
Yaf_Route_Rewrite
Yaf_Route_Regex
当你没定义使用路由协议的时候,默认路由协议是 Yaf_Route_Static
。而且路由是有加载顺序的,如果匹配上第一条就不向下匹配了,大家这点要注意哦。
1. 默认协议路由
默认路由的匹配模式是这样如下这样的:
/:modules/:controller:/:action/:params
会按照上边的顺序匹配,但是这里有一点注意的,当你访问
/admin/index/index
会解析成如下这样
array(
'module' => 'admin',
'controller' => 'index',
'action' => 'index',
)
但是,如果是
/admin/index
缺少了 Action 参数,系统会先判断 Action,所以它就把admin
判断成了 Controller,index
判断成了 Action ,这就是为什么你定义了路由但是它显示不对的原因,这个在Yaf_Route_Supervar
中也一样。
2. 加载路由
这里有两种方法,一种是
ini
配置文件的方式,当然这个ini会被解析成数组然后加载的,其实跟第二种直接写是一样的。我们这里重点写第二种。
- 1.我们
Bootstrap
中加载路由,Bootstrap 不懂的可以看 使用 Bootstrap -
2.注册路由,在
Bootstrap
中写一个_init
开头的方法,例如_initRoute
,然后类似如下public function _initRoute(Yaf_Dispatcher $dispatcher) { $router = Yaf_Dispatcher::getInstance()->getRouter(); $router->addConfig(Yaf_Registry::get("config")->routes); }
上边的代码是读取的Ini 文件中的配置,我们可以这样加载,譬如我们要使用这种格式 index.php?m=admin&c=index&a=index
,就可以在里边添加我们的路由,代码如下:
$route = new Yaf_Route_Simple("m", "c", "a");
$router->addRoute("name", $route);
-
3.如果你的服务器对路由支持不是太好的话,你可以使用
Yaf_Route_Supervar
, 譬如公司的这个电脑装的是IIS ,然后又想去掉index.php
,我是 iis7.5,你可以这样:$route = new Yaf_Route_Supervar("r"); $router->addRoute("supervar", $route);
然后 IIS web.config 配置如下:
<rules>
<rule name="Yaf Rewrite" stopProcessing="true">
<match url="^(.*)$" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false">
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
</conditions>
<action type="Rewrite" url="index.php?r={R:0}" appendQueryString="false" logRewrittenUrl="false" />
</rule>
</rules>
像还有 rewrite map regex 这种路由都没有啥难度,我就不多说了,大家看官方文档 Yaf Route ,有问题的可以去 weiduyun 提问。
自定义路由
上边的路由基本已经满足你的需求,如果还不行,你可以自定义路由,自定义路由继承
Yaf_Route_Interface
接口,接口代码如下:
Interface Yaf_Route {
abstract public boolean route ( Yaf_Request_Abstract $request );
}
然后我写一个小例子,给大家演示吧,也就是说如果匹配 url 第一个参数是
admin
就是 admin 模块,代码如下:
<?php
/**
* Yaf 自定义路由协议 Demo
* 自定义继承 Yaf\Request_Abstract,为的是修改protected params参数
*
* @author widuu<admin@widuu.com>
* @version 0.1
*/
class Router extends Yaf\Request_Abstract implements Yaf\Route_Interface{
/**
* Route 实现,继承实现Yaf_Router_Interface route
*
* @access public
* @param Object(Yaf_Request_Http) $req 默认参数
* @return boole true
*/
public function route ($req){
$uri = explode('/', trim($_SERVER['REQUEST_URI'],'/'));
// Test 测试匹配路由为 admin,将模块设定admin
// URL 路径就成了 /admin/:controller/:action/:params
if($uri[0] == 'admin'){
$req->module = 'admin';
$req->controller = !empty($uri[1])?$uri[1]:'';
$req->action = !empty($uri[2])?$uri[2]:'';
if(!empty($uri[3])){
$param = array();
$params = array_slice($uri, 3);
foreach ( $params as $key => $value) {
if( $key %2 == 0){
$param[$params[$key]] = $params[$key+1];
}
}
$req->params = $param;
}
}
return true;
}
public function assemble (array $mvc, array $query = NULL){
return true;
}
}
这里边为什么要继承 Yaf\Request_Abstract
因为 req 中的 params 是 proteced 属性,所以只有继承才能修改,当然前边也说了,route 默认接收的是 Yaf\Request_http
。使用跟前边一样,在 Bootstrap 中注册就可以了。
//自定义路由测试
$router->addRoute('myroute',new Router());
就介绍到这里,有问题的可以去社区提问。
发表评论 取消回复