路由

Fuel 的路由從简易靜態路由到進階使用 HTTP 變数为基础的路由都有。

路由被設定在 fuel/app/config/routes.php

保留路由

在 Fuel 有兩个保留路由。它們是 _root__404_

return array(
    '_root_'  => 'welcome/index',
    '_404_'   => 'welcome/404',
);

基本路由

在左邊的路由與請求的 URI 被比較,如果一个配對被找到,請求会被路由到右邊的 URI。

这能让你像以下这樣做:

return array(
    'about'   => 'site/about',
    'contact' => 'contact/form',
    'admin'   => 'admin/login',
);

稍微進階的路由

你可以在你的路由包含任何正規表達式, 左邊是針對請求 URI 配對,右邊是左邊的替換, 所以你可以根據左邊的正規表達式,在右邊使用反向引用。 也有一些特別的語句能让你配對任何東西或只是片段:

这裡有一些範例:

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,透過傳遞 falsetrue 做为第三參数:

// 路由只在它是一个 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.');
		}
};

模組 & 路由

閱讀關於模組如何处理路由