路由
Fuel 的路由從简易靜態路由到進階使用 HTTP 變数为基础的路由都有。
路由被設定在 fuel/app/config/routes.php。
保留路由
在 Fuel 有兩个保留路由。它們是 _root_ 及 _404_。
- _root_ - 當沒有指定 URI 時預設的路由。
- _404_ - 當沒有控制器或动作被找到時使用的路由, 也可被用作一个捕捉所有的路由。
return array(
'_root_' => 'welcome/index',
'_404_' => 'welcome/404',
);
基本路由
在左邊的路由與請求的 URI 被比較,如果一个配對被找到,請求会被路由到右邊的 URI。
这能让你像以下这樣做:
return array(
'about' => 'site/about',
'contact' => 'contact/form',
'admin' => 'admin/login',
);
稍微進階的路由
你可以在你的路由包含任何正規表達式, 左邊是針對請求 URI 配對,右邊是左邊的替換, 所以你可以根據左邊的正規表達式,在右邊使用反向引用。 也有一些特別的語句能让你配對任何東西或只是片段:
- :any - 配對來自 URI 點上的任何東西
- :segment - 只配對 URI 中的第一段,但該片段可以是任何東西
- :num - 配對任何数字
- :alpha - 配對任何英文字元,包括 UTF-8
- :alnum - 配對任何英数字元,包括 UTF-8
这裡有一些範例:
return array(
'blog/(:any)' => 'blog/entry/$1', // 路由 /blog/entry_name 到 /blog/entry/entry_name
'(:segment)/about' => 'site/about/$1', // 路由 /en/about 到 /site/about/en
'(\d{2})/about' => 'site/about/$1', // 路由 /12/about 到 /site/about/12
);
進階路由
你也可以在你的路由命名參数。这能让你給你的 URI 片段具名, 然後可以在你的行动中被存取。
範例:
return array(
'blog/:year/:month/:id' => 'blog/entry', // 路由 /blog/2010/11/entry_name 到 /blog/entry
);
在以上範例中会捕捉以下的 /blog/2010/11/entry_name。 它会路由該請求到你的 'blog' 控制器的 'entry' 动作。在那裡, 具名參数将像这樣可被使用:
$this->param('year');
$this->param('month');
$this->param('id');
請注意,當具名參数是一个正規表達式,会計数每个具名參数做为一个反向引用。 所以在一个像 ':name/(\d{2})' 的路由,對你的兩位数片段來說,反向引用是 $2,而不是 $1!
HTTP 變数为基础的路由
你可以路由你的 URL 到控制器和动作,基於 HTTP 變数去呼叫它們, 这使得它能快速且简易的製造 RESTful 控制器。
範例:
return array(
// 路由 GET /blog 到 /blog/all 以及 POST /blog 到 /blog/create
'blog' => array(array('GET', new Route('blog/all')), array('POST', new Route('blog/create'))),
);
你可以很正常的在你的 URL 使用具名參数和正規表達式:
return array(
'blog/(:any)' => array(array('GET', new Route('blog/show/$1'))),
);
你也可以指定如果此路由只支援 http、或只有 https,透過傳遞 false 或 true 做为第三參数:
// 路由只在它是一个 https 請求時有效
return array(
'blog/(:any)' => array(array('GET', new Route('blog/show/$1'), true)),
);
具名路由和路由反轉
路由反轉的想法是这樣:你有一个管理區域并且有一个設置給它的路由。 在你的檢視中,你会想要使用一个 HTML 連結連到該管理區域,例如像 'admin/start/overview'。 现在你決定移动東西并且最終移动特定頁面到 'admin/overview'。 結果现在你需要在你所有的檢視中更新此連結……
當用这些具名路由來使用路由反轉,你可以連接一个錨點到一个具名路由,如此一來,當路由改變, 在你檢視中的連結将自动地依循改變
路由範例:
return array(
'admin/start/overview' => array('admin/overview', 'name' => 'admin_overview'), // 为 admin/overview 頁面添加一个具名路由
);
連結範例:
// 產生 <a href="http://your_base_url/admin/start/overview">Overview</a>
echo Html::anchor(Router::get('admin_overview'), 'Overview');
請注意,这目前只對定義在 app/config/routes.php 中的路由運作,還不能用在模組路由。
內嵌路由
一个路由不一定要解析为一个控制器方法。FuelPHP 也支援內嵌路由,它被定義为一个取代控制器方法的閉包(closure)。 就像控制器方法,內嵌路由必須回傳一个 Response 物件, 不管是手动鍛造一个,或做为执行一个已鍛造的 Request 的結果。
路由範例:
return array(
'secret/mystuff' => function () {
// 此路由只在开发环境运行
if (\Fuel::$env == \Fuel::DEVELOPMENT)
{
return \Request::forge('secret/mystuff/keepout', false)->execute();
}
else
{
throw new HttpNotFoundException('This page is only accessable in development.');
}
};