当前位置: 首页 > 文档资料 > FuelPHP 中文文档 >

路由 - 一般

优质
小牛编辑
132浏览
2023-12-01

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,透过传递 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.');
		}
};

模组 & 路由

阅读关于模组如何处理路由