# Yaf_Router 类

(Yaf >=1.0.0)

## 简介

Yaf_Router 是标准的框架路由。路由是获取 URI 端点（位于基本 URI 之后的 URI 部分：参考 Yaf_Request_Abstract::setBaseUri()）并将其分解为参数得到哪个 module、controller 和 action 需要接收请求。module、controller、action 和其它参数打包到 Yaf_Request_Abstract 对象中，然后由 Yaf_Dispatcher 处理。路由只发生一次：最初接到请求和在第一个 controller 分发之前。 Yaf_Router 是设计来允许使用纯 PHP 结构的类似 mod_rewrite 的功能。它非常松散的基于 Ruby on Rails 的路由，并且不需要提前知悉 webserver URL 重写的相关知识。它设计为跟单个 Apache mod_rewrite（或其中之一个） 规则一起使用：

示例 #1 Apache 重写规则

    RewriteEngine on
    RewriteRule !\.(js|ico|gif|jpg|png|css|html)$ index.php

或者（首选）：

示例 #2 Apache 重写规则

    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} -s [OR]
    RewriteCond %{REQUEST_FILENAME} -l [OR]
    RewriteCond %{REQUEST_FILENAME} -d
    RewriteRule ^.*$ - [NC,L]
    RewriteRule ^.*$ index.php [NC,L]

如果使用 Lighttpd，以下重写规则有效：

示例 #3 Lighttpd 重写规则

    url.rewrite-once = (
      ".*\?(.*)$" => "/index.php?$1",
      ".*\.(js|ico|gif|jpg|png|css|html)$" => "$0",
      "" => "/index.php"
    )

如果使用 Nginx，以下重写规则有效：

示例 #4 Nginx 重写规则

    server {
      listen ****;
      server_name  yourdomain.com;
      root   document_root;
      index  index.php index.html;

      if (!-e $request_filename) {
        rewrite ^/(.*)  /index.php/$1 last;
      }
    }

## 默认路由

Yaf_Router 预设了默认路由 Yaf_Route_Static，将以 controller/action 的形式匹配 URI。此外，module 名可以被指定为第一个路径元素，允许 URI 设置为 module/controller/action 形式的 URI。最后，它也会匹配默认追加到 URI 中所有附加参数——controller/action/var1/value1/var2/value2。

> 注意:

> Module 名必须在配置中定义，就 application.module="Index,Foo,Bar" 而言，在这种情况下，仅 index、foo 和 bar 可以认做 module 名。如果没有配置，那么 Yaf 使用默认 module 名“Index”。

如何匹配这些路由的一些例子：

示例 #5 Yaf_Route_Static（默认路由）示例

    // Assuming the following configure:
    $conf = array(
       "application" => array(
          "modules" => "Index,Blog",
       ),
    );

    Controller only:
    http://example/news
        controller == news
    Action only(when defined yaf.action_prefer=1 in php.ini)
        action  == news

    Invalid module maps to controller name:
    http://example/foo
        controller == foo

    Module + controller:
    http://example/blog/archive
        module     == blog
        controller == archive

    Module + controller + action:
    http://example/blog/archive/list
        module     == blog
        controller == archive
        action     == list

    Module + controller + action + params:
    http://example/blog/archive/list/sort/alpha/date/desc
        module     == blog
        controller == archive
        action     == list
        sort       == alpha
        date       == desc

## 类摘要

class Yaf_Router {
/* 属性 */
protected $_routes;
protected $_current;
/* 方法 */
public function __construct()
public function addConfig(Yaf_Config_Abstract `$config`): bool
public function addRoute(string `$name`, Yaf_Route_Abstract `$route`): bool
public function getCurrentRoute(): string
public function getRoute(string `$name`): Yaf_Route_Interface
public function getRoutes(): mixed
public function route(Yaf_Request_Abstract `$request`): bool
}

## 属性

_routes

  已注册路由栈

_current

  在路由阶段后，这用于指示当前请求的路由名称。 可以通过 Yaf_Router::getCurrentRoute() 获取此名称。

## 目录

- Yaf_Router::addConfig — 向 Router 中添加配置文件中定义的路由
- Yaf_Router::addRoute — 往 Router 中添加新的路由
- Yaf_Router::__construct — Yaf_Router 构造方法
- Yaf_Router::getCurrentRoute — 取得当前有效的路由名
- Yaf_Router::getRoute — 通过名称检索路由
- Yaf_Router::getRoutes — 检索已注册的路由
- Yaf_Router::route — The route purpose

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open