Rest コントローラ

Rest コントローラとは?

Rest コントローラは Base コントローラを継承したもので、RESTful のサポートが組み込まれています。 これは、API を簡単に構築をすることが出来ます。

Please note: もし、REST コントローラの中で before()router メソッドを 使うなら、うまく動作させるために親クラスの parent::before() (または router) を呼び出さなければ いけません

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 コントローラにおいても "action_" というプレフィックスのメソッドは、 HTTP メソッドをプレフィックスとしたメソッドの代わりになることに気づくでしょう。 HTTP メソッドに当てはまるプレフィクスのメソッドがない場合、"action_" プレフィクスのメソッドが代わりに呼び出されます。 Rest コントローラがサポートしている一般的な HTTP メソッドは下記のとおりです。

HTTP メソッド 説明
GET 既存のリソースの情報を取得するために使用される。 ブラウザで URL を入力して開いたり、リンクをクリックする際に使用され、ユーザなどが情報を取得するのに最適なメソッド。 また、フォームでもこのメソッドは使用でき、検索フォームなどで、送信されたクエリ文字列に対する情報を取得する際にも使用される。
POST 新しいリソースを作成する際に使われる。PUT メソッドが HTML をサポートしていないため、リソースの更新にも使用される。大抵のフォームでは POST メソッドが使用されるが、送信したクエリ文字列に対する情報を取得する場合には使用されない。
PUT 既知の id に対応するリソースを作成・更新する際に使用される。HTML5 ではサポートされないため、あまり使用されない。ただし、 XMLHttpRequests のために多くのブラウザでサポートされている。
DELETE 既存のリソースを削除する際に使用される。PUT メソッドと同様に HTML5 でサポートされなくなったものの、 XMLHttpRequests のために多くのブラウザでサポートされている。

出力

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

ファイル拡張子が URL で定義されているので、これは JSON として出力されます。デフォルトでは、XML フォーマット出力されるか、 fuel/core/config/rest.php に設定されているフォーマットで出力されます。

Configuration

REST コントローラは fuel/core/config/rest.php でグローバルに設定されており、既にデフォルト値が入力されています。 この設定ファイルを上書きするには、あなたのアプリケーションの設定ディレクトリに同名の設定ファイルを追加して、 設定したい値に変更してください。 これによって、Core の設定が上書きされますが、上書きされなかった設定は元の値が保持されます。

設定可能な値一覧

パラメータ デフォルト 説明
default_format string
'xml'
結果を返す際のデフォルトフォーマット。 コントローラでフォーマットが指定されなかった場合とフォーマットの自動判定にすべて失敗した場合のみに使用される。
xml_basenode string
'xml'
XML で出力する際に使われるベースノードの XML タグ
realm string
'REST API'
パスワード保護された REST API のログインダイアログで表示される名前。
auth string
''
Defines the type of authentication needed. Valid values are 'basic' and 'digest'. You can also define a name of controller method which must be called to check authorization. This method may return a boolean (true will allow the request, false will return a default 401 response is returned), or a Response object.
Leave this empty if no autorization need to be performed.
valid_logins array
array('admin' => '1234')
'basic' と 'digest' 認証で使用される、ユーザ名とパスワードの組み合わせを key/value で定義した配列。
ignore_http_accept boolean
false
REST リクエストで、返す結果のフォーマットを判定する際に HTTP_ACCEPT ヘッダーをパースするかどうか。

サポートされるフォーマット

フォーマットの決定

返される結果のフォーマットを決定するために、REST コントローラは次のアルゴリズムを用います:

多くの場合、 HTTP_ACCEPT が存在し、正しい結果のフォーマットである text/html を(少なくとも)含んでいます。 このことは $rest_formatrest.php 設定ファイルで定義されたグローバルなデフォルトが 使われないことを意味しています。

HTTP_ACCEPT がフォーマットの判定に使われないようにするには、 rest.phpignore_http_accept キーの値を true に設定します。

結果のフォーマットを REST コントローラ内でハードコードすることはバッドプラクティスであることに注意してください。 返される結果のフォーマットはクライアントによって指定されるべきです。HTTP_ACCEPT に備えて、 例えば、jQuery.ajax() のような、 ほとんどの Ajax の手法は、application/json ヘッダを設定することを許可します。

XML Base Node Name

XML が出力される場合に、 XML のベースノードは $xml_basenode パラメータで設定されます。

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)

このメソッドは、フォーマットと出力ロジックを介して応答データを送信するために使用されます。 必要に応じて、2 番目のパラメータとしてステータスコードを設定することができます。