LaravelでRest APIを開発する

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;
}

Webエンジニアブログにコメント

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

LaravelでRest APIを開発するの記事にコメントを投稿