PHPフレームワークのLaravelでRestfulインタフェースを作成
簡単な例で入門
Laravelで効率的にRest APIを開発することが出来ます。
作成するファイル
下の3つのファイルを作成しました。
- app/routes.php
- app/models/Todo.php
- app/controllers/TodoController.php
routes.php
routes.phpでアプリケーションのルートをコントローラーにマッピングします。
Route::controller('/', 'TodoController');
TodoControllerにAPIをコーディングしていくことになります。
Model
APIではデータベースを操作するので、Modelを作成します。
class Todo extends Eloquent { protected $table = 'todos'; }
コントローラーからTodoモデル経由でデータベースを操作可能になります。
Controller
最もシンプルにコーディングできる全件取得メソッドを作成します。
class TodoController extends BaseController { public function getIndex() { $todos = Todo::all(); return Response::json($todos); } }
Todoモデル経由でデータを取得し、そのデータをjson形式でレスポンスする処理を行っているコードです。
LaravelでRest APIを作成する際には、コントローラのアクション名を
HTTPメソッド名/リクエストURL
という書式で、その書式をキャメルケースとして表現することで、効率的にREST APIを構築できるようになっています。上のコードの場合は、
getIndex
なので、
HTTPのGETメソッドで、index(ルート)
にアクセスした際にマッピングされる処理になります。
データの個別取得
次にデータの個別取得のコードです。
public function getId($id) { $todo = Todo::where('id', '=', $id)->get(); if ($todo->isEmpty()) { // データが空なら404を返す return Response::json(array('status' => 'NOT-FOUND'), 404); } else { // データがある場合はjson形式でレスポンスする return Response::json(array( 'status' => 'FOUND', 'data' => $todo[0] )); } }
データの個別取得なので、$id引数を受け取るようになっています。APIのURLの書式は、
/id/100
などになります。
検索
検索のAPIです。
public function getSearch($keyword) { $todos = Todo::where('title', 'LIKE', '%'.$keyword.'%')->get(); return Response::json($todos); }
URLの書式は、
/serach/[keyword]
になります。
全件取得や個別取得と同様にGETメソッドでリクエストすることでデータを取得できます。
登録
データの登録はGETではなく、POSTメソッドを利用して、
/new
のURLでデータを登録できるようにします。
public function postNew() { // 新しいModelインスタンスの作成とPOSTパラメータの取得 $todo = new Todo(); $todo->title = Input::get("title"); $input = array( 'title' => $todo->title, ); // バリデーションルールの設定 $rules = array( 'title' => 'required|max:30', ); // バリデーターの作成 $validator = Validator::make($input, $rules); // バリデーションOK if (!$validator->fails()) { $todo->save(); $last_todo = $todo->id; $todos = Todo::whereId($last_todo)->get(); $response = Response::json(array( 'status' => 'OK', 'data' => $todos[0] ), 201); } else { // バリデーションがNGならエラーメッセージを返す $message = $validator->messages(); $response = Response::json(array( 'status' => 'ERROR', 'message' => $message ), 409); } return $response; }
更新
データの更新はPUTメソッドを利用します。リクエストURLの例は以下のとおりです。
/id/100
個別取得のURLと書式は同じですが、PUTメソッドを利用すると、IDが100のデータに対してupdate処理を行うことが出来ます。
public function putId($id) { $input = array( 'title' => Input::get("title"), ); $rules = array( 'title' => 'required|max:30', ); $validator = Validator::make($input, $rules); if (!$validator->fails()) { $update = Todo::where('id', '=', $id)->update(array( 'title' => Input::get("title"), )); if ($update) { $result = Todo::whereId($id)->get(); $response = Response::json(array( 'status' => 'OK', 'data' => $result ), 201); } else { $response = Response::json(array( 'status' => 'NOT-FOUND', ), 404); } } else { $message = $validator->messages(); $response = Response::json(array( 'status' => 'ERROR', 'message' => $message ), 409); } return $response; }
削除
データの削除はDELETEメソッドで行います。
/id/100
HTTPメソッドはDELETEを使います。
public function deleteId($id) { $delete = Todo::where('id', '=', $id)->delete(); if ($delete) { $response = Response::json(array( 'status' => 'OK' )); } else { $response = Response::json(array( 'status' => 'NG' ), 404); } return $response; }