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

Rest 控制器 - 一般

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

Rest 控制器是什幺?

Rest 控制器是 Base 控制器的扩充并内建支援 RESTful。 这能让你轻鬆建立 API。

请注意: 如果你在你的 REST 控制器使用 before()router 方法, 你 必须 呼叫父层方法 parent::before()(或路由)以保持正常运作。

使用 Rest 控制器

如同所有的控制器,你在 fuel/app/classes/controller 目录里建立一个类别。 它们需要扩充 Controller_Rest 类别并且预设前缀为 "Controller_"。 下面是一个控制器 "test" 的範例:

class Controller_Test extends Controller_Rest
{

	public function get_list()
	{
		return $this->response(array(
'foo' => Input::get('foo'),
'baz' => array(
	1, 50, 219
),
'empty' => null
		));
	}
}

此控制器的 "list" 方法被以下的 URL 呼叫:

http://localhost/test/list.json?foo=bar

你会注意到,Rest 控制器使用 HTTP 方法做为前缀,而不是常见的 "action_"。 当没有发现相对应于 HTTP 方法前缀的方法时,将退回到 "action_" 前缀。 Rest 控制器支援所有常见的 HTTP 方法,比如:

HTTP 方法描述
GET用于取出关于现有资源的资讯。 当你输入一个 URL 并前往浏览,或当你点下一个连结,这会被浏览器使用。 所以它适合取回在你资源(如使用者)的资讯。表单也可以使用此方法来取回送交查询字串的资讯(即搜寻表单)。
POST用于建立新资源。由于 HTML 支援 PUT 方法的不足,它也被用于更新资源。大多数表单使用 POST 方法,除了当它们打算取回送交查询字串的资讯。
PUT用于建立或更新有已知 ID 的资源。你被预期传递所有特性。遗漏的应该被设为 NULL。较不常用因为还不被 HTML(5)支援。虽然大多数的浏览器支援 XMLHttpRequests。
DELETE用于删除现有资源。如同 PUT,不被 HTML(5)支援但大多数浏览器支援 XMLHttpRequests。
PATCH用于更新有已知 ID 的资源。你只传递你想要更新的特性。较不常用因为还不被 HTML(5)支援。虽然大多数的浏览器支援 XMLHttpRequests。

这不是一个限制性的清单,FuelPHP 框架接受任何你网页伺服器接受的 HTTP 方法。

输出

{
	"foo":"bar",
	"baz":[1,50,219],
	"empty":null
}

这输出为 json,因为副档名被定义在 URL。预设情况下, 回应将被格式化为 XML 或其他设定在 fuel/core/config/rest.php 中的格式。

配置

REST 控制器可以透过 fuel/core/config/rest.php 配置档案全域地配置。 它已经填入了一个预设配置。你可以透过添加一个同名的配置档案到你应用程序的 config 目录来覆写此配置, 并在这里设定你想要变更的值。 这些将覆写核心配置,但保留你没有覆写的部份。

以下的全域配置值可以被定义:

参数类型预设描述
default_format字串
'xml'
要回传结果的预设格式。这只用在控制器中没定义格式, 而且所有自动检测机制失效时。
xml_basenode字串
'xml'
要被用在输出 XML 结构时的基本节点 XML 标籤
realm字串
'REST API'
受密码保护的 REST API 显示在登入对话框的名称。
auth字串
''
定义所需的认证类型。有效的值有 'basic' 和 'digest'。 你也可以定义一个必须被呼叫来检查认证的控制方法名称。此方法可能回传一个布林。 (true 将允许请求,false 将回传一个预设的 401 回应),或一个 Response 物件。
留空如果没有认证需要被执行。
valid_logins字串
array('admin' => '1234')
一个键/值配对的阵列,为 'basic' 和 'digest' 授权方法定义有效的使用者名称及密码。
ignore_http_accept布林
false
HTTP_ACCEPT 表头是否应该在一个 REST 请求被解析,以确定回传的格式。

支援格式

  • xml - 几乎任何程式语言可以阅读 XML
  • json - 对 JavaScript 和越来越多的 PHP 应用程序来说很有用
  • csv - 用试算表程式开启
  • html - 任何经由你方法回传的字串
  • php - 可以被 eval() 执行的 PHP 程式码表示形式
  • serialize - 可以在 PHP 中被反序列化的序列化资料

如果你的控制器方法回传一个阵列,但请求的输出格式是阵列不能被转换的(例如 html), 当你的应用程序运行在一个生产环境时,你会得到一个 406 NOT ACCEPTABLE 状态, 或在任何其他环境时, 是一个警告讯息以及一个阵列倒出的 JSON。

确定格式

要确定结果应该被回传的格式,REST 控制器使用以下的演算法:

  • 使用 protected 特性 $format 如果它包含一个支援的格式
  • 使用 URL 扩充如果它包含一个支援的格式
  • 使用被指定在路径中的 :format 变数的格式如果它包含一个支援的格式
  • 使用指定在请求 format 变数中的格式
  • 使用定义在 HTTP_ACCEPT 表头的格式
  • 使用你类别的 $rest_format 特性所定义的预设值
  • 使用定义在全域配置档案的 default_format

在大多数情况下,HTTP_ACCEPT 会呈现并包含(至少)text/html,这是一个有效的结果格式。 这意味着 $rest_format、以及任何定义在 rest.php 配置档案中的全域预设, 将永远不会被使用。

要停用 HTTP_ACCEPT 做为一个有效的格式来源, 设定在 rest.php 里的 ignore_http_accept 配置键为 true

请注意,在你的 REST 控制器硬写任何结果格式被认为是不好的做法。 它应该是由客户端指定应该回传的结果格式。在 HTTP_ACCEPT 的情况下,大多数 ajax 解决方案,例如 jQuery.ajax(),允许你设定接收表头为 application/json

XML 基本节点名称

当使用 XML 输出你可以透过设定 $xml_basenode 参数来设定 XML 基本节点。

class Controller_Test extends Controller_Rest
{
	// 设定给全控制器
	protected $xml_basenode = 'my_basenode';

	// 或在你的控制器函式内
	public function get_items()
	{
		$this->xml_basenode = 'other_basenode';

		return $this->response(array(
'foo' => Input::get('foo'),
'baz' => array(
	1, 50, 219
),
'empty' => null
		));
	}
}

特殊控制器方法

response($data = array(), $http_code = 200)

此方法是用来透过格式化和输出逻辑传送你的回应资料。 你可以选择性的设定一个状态码做为第二参数。