前提介绍

今天主要的说一下 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());

就介绍到这里,有问题的可以去社区提问。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部