2024 年日本 PHP 研討會

Yaf_Router 類別

(Yaf >=1.0.0)

簡介

Yaf_Router 是標準的框架路由器。路由是指取得 URI 端點(URI 中位於基礎 URI 之後的部份:請參考 Yaf_Request_Abstract::setBaseUri())並將其分解成參數,以決定哪個模組、控制器以及該控制器的哪個動作應該接收請求的過程。模組、控制器、動作和其他參數的值會被包裝成一個 Yaf_Request_Abstract 物件,然後由 Yaf_Dispatcher 進行處理。路由只會發生一次:在初始收到請求且在第一個控制器被分派之前。Yaf_Router 的設計允許使用純 PHP 結構實現類似 mod_rewrite 的功能。它非常鬆散地基於 Ruby on Rails 的路由,並且不需要任何 Web 伺服器 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/controller/action 形式的 URI。最後,預設情況下,它還會匹配附加到 URI 的任何其他參數 - controller/action/var1/value1/var2/value2。

注意:

模組名稱必須在設定檔中定義,例如 application.module="Index,Foo,Bar",在這種情況下,只有 index、foo 和 bar 可以被視為模組名稱。如果沒有設定,則只有一個名為「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

類別概要

類別 Yaf_Router {
/* 屬性 */
保護 $_routes;
保護 $_current;
/* 方法 */
公開 __construct()
公開 addRoute(字串 $name, Yaf_Route_Abstract $route): 布林值
公開 getRoutes(): 混合
}

屬性

_routes

已註冊的路由堆疊

_current

在路由階段之後,這指示用於路由目前請求的路由名稱。您可以透過 Yaf_Router::getCurrentRoute() 取得此名稱。

目錄

新增註釋

使用者貢獻的註釋

此頁面沒有使用者貢獻的註釋。
To Top