官方文档:http://www.laruence.com/manual/yaf.routes.static.html

其中 Yaf_Route_Map 感觉文档没写很清楚,也没去研究
具体可以参考下:http://php.net/manual/zh/yaf-route-map.construct.php

介绍和原理

路由就是通过URL参数并根据路由规则,去执行到指定模块的控制器的方法。

一旦路由成功,路由器将会把解析的路由参数信息,传递给请求对象(Yaf_Request_Abstract object),

这些信息包括moduel、controller、action、用户params等。

然后分发器(Yaf_Dispatcher)就会按照这些信息,去正确的执行控制器的方法。

路由器也有插件钩子,就是routerStartup和routerShutdown,他们在路由解析前后分别被调用。

添加路由

一、 默认路由 Yaf_Route_Static

默认的路由协议Yaf_Route_Static, 就是分析请求中的request_uri, 在去除掉base_uri以后, 获取到真正的负载路由信息的request_uri片段。

具体的策略是, 根据”/“对request_uri分段, 依次得到Module,Controller,Action, 在得到Module以后, 还需要根据Yaf_Application::$modules来判断Module是否是合法的Module,

如果不是, 则认为Module并没有体现在request_uri中, 而把原Module当做Controller, 原Controller当做Action。

举例如下:

两段,user/user, 控制器/方法
http://localhost/myYaf/index.php/user/user/

三段,user/user/show,模块/控制器/方法
http://localhost/myYaf/index.php/user/user/show/

二、 简单路由 Yaf_Route_Simple

1、通过程序添加

入口文件index.php,执行了bootstrap()方法。

$application->bootstrap()->run();

所以在Bootstrap.php文件中可以添加路由信息

public function _initRoute(Yaf\Dispatcher $dispatcher) {
    //在这里注册自己的路由协议,默认使用简单路由
    $router      = \Yaf\Dispatcher::getInstance()->getRouter();
    $simpleRoute = new \Yaf\Route\Simple('m', 'c', 'a');

    $router->addRoute('simple_route', $simpleRoute);
}

配置好后可以如下访问
http://localhost/myYaf/index.php?m=user&c=user&a=show

2、配置文件添加;建议使用这种方式

application.ini

[routes]
;添加一个名为simple的路由协议
routes.simple.type="simple"
routes.simple.controller=c
routes.simple.module=m
routes.simple.action=a

不同的环境记得继承他

[product : common : routes]
[develop : common : routes]

修改_initRoute

public function _initRoute(Yaf\Dispatcher $dispatcher) {
    $router      = \Yaf\Dispatcher::getInstance()->getRouter();
    $router->addConfig( \Yaf\Registry::get('config')->routes );
}

再次访问,也是可以成功的
http://localhost/myYaf/index.php?m=user&c=user&a=show

三、 变量路由 Yaf_Route_Supervar

Yaf_Route_Supervar和Yaf_Route_Simple相似, 都是在query string中获取路由信息,
不同的是, 它获取的是一个类似包含整个路由信息的request_uri

 <?php
/**
* 指定supervar变量名
*/
$route = new Yaf_Route_Supervar("r");
$router->addRoute("name", $route);
/**
* 对于如下请求: "http://domain.com/index.php?r=/a/b/c
* 能得到如下路由结果
*/
array(
 'module'     => 'a',
 'controller' => 'b',
 'action'     => 'c',
)

注意:
在query string中不包含supervar变量的时候, Yaf_Route_Supervar会返回失败, 将路由权交给下一个路由协议。

四、 重写路由 Yaf_Route_Rewrite

Yaf_Route_Rewrite是一个强大的路由协议, 它能满足我们绝大部分的路由需求:

Bootstrap.php 的方法 _initRoute 添加路由信息

 <?php
     //创建一个路由协议实例
     $route = new Yaf_Route_Rewrite(
       'product/:ident', // 路径

       array(
         'controller' => 'products',
         'action' => 'view'
       )
     );
     //使用路由器装载路由协议
     $router->addRoute('product', $route);

Yaf_Route_Rewrite 构造函数有两个参数 路径指定控制器和方法

路径有两个标识:冒号“:”, 星号“*”

冒号(:)指定了一个参数变量的名称,当我们访问http://domain.com/product/choclolat-bar,就是把choclolat-bar当作ident的值
可以通过$this->getRequest()->getParam('ident') 获取。

星号(*)是通配符,意思就是在Url中,它后面的所有段都将作为一个通配数据被存储。
如果设置路径path/product/:ident/*,我们访问 http://domain.com/product/chocolate-bar/test/value1/another/value2
那么所有的在’chocolate-bar’后面的段,都将被做成变量名/值对,因此这样会给我们下面的结果:

ident = chocolate-bar
test = value1
another = value2

五、 正则路由 Yaf_Route_Regex

我们之前的路由协议都很好的完成了基本的路由操作,我们常用的也是他们,
然而它们会有一些限制,这就是我们为什么要引进正则路由(Yaf_Route_Regex)的原因。

正则路由给予我们preg正则的全部力量,但同时也使得我们的路由协议变得更加复杂了一些。

即使是他们有点复杂,我还是希望你能好好掌握它,因为它比其他路由协议要灵活一点点。

首先在 application.ini 追加了一个正则路由

路由是按配置顺序,依次匹配的

[routes]
;添加一个名为simple的路由协议
routes.simple.type="simple"
routes.simple.controller=c
routes.simple.module=m
routes.simple.action=a

; 添加一个正则路由协议; 
routes.user.type = "regex"
routes.user.match = "#^/([0-9]+)\/?#"
routes.user.route.module = "Index"
routes.user.route.controller = "Index"
routes.user.route.action = "test"
routes.user.map.1 = userId

同样的Bootstrap.php文件也需要如下配置

public function _initRoute(Yaf\Dispatcher $dispatcher) {
    $router      = \Yaf\Dispatcher::getInstance()->getRouter();
    $router->addConfig( \Yaf\Registry::get('config')->routes );
}

这时我们访问http://localhost/myYaf/index.php/123, 12 就是userId