作成してみよう!LaravelでAPIを扱う方法【初心者向け】

初心者向けにLaravelでAPIを使う方法について解説しています。APIを提供することで他のアプリケーションとやりとりすることができます。簡単なAPIを作成する手順を説明しているので、書き方を理解しておきましょう。

TechAcademyマガジンはオンラインのプログラミングスクールTechAcademy [テックアカデミー]が運営する教育×テクノロジーのWebメディアです。初心者でもすぐ勉強できる記事が2,000以上あります。

LaravelでAPIを扱う方法について解説します。

CRUD操作のAPIを実際に作成しているので、書き方を覚えておきましょう。

 

なお本記事は、TechAcademyのPHP/Laravel講座の内容をもとに紹介しています。

 

田島悠介

今回は、Laravelに関する内容だね!

大石ゆかり

どういう内容でしょうか?

田島悠介

Laravelでapiを使う方法について詳しく説明していくね!

大石ゆかり

お願いします!

 

APIとは

API(Application Programming Interface)は、アプリケーション同士を協調して動作させるための仕様です。
アプリケーションはAPIを提供することで、他のアプリケーションとやりとりすることができます。

例えば、Twitter、Facebookなど様々な事業者は自社のサービスを外部のアプリケーション向けに提供するために、Web APIを公開しています。外部のアプリケーションはそれらのWeb APIを通してサービスを利用できます。

私たちがWebページを参照する場合、WebブラウザがHTTPのURLにリクエストし、レスポンスとして返されるHTMLを描画します。

それと同様にWeb APIの場合も、アプリケーションがHTTPのURLにリクエストし、レスポンスとして返されるデータを処理します。

Web APIでは、HTTP経由でJSON形式のメッセージを送受信するのが一般的です。JSON(JavaScript Object Notation)は、JavaScriptの記法をベースにオブジェクトを表記する方法で、様々なプログラミング言語で使われる汎用的な形式です。

 

APIの作成方法(crudなど)

基本的なCRUD(Create, Read, Update, Delete)の操作について、一番簡単な作成方法を説明します。

以下のような手順で作成します。

  • データベースマイグレーションを実施する。
  • モデルを実装する。
  • リソースコントローラを実装する。
  • APIリソースルートを追加する。

マイグレーション、モデルはWebページと共用できます。
コントローラ、ルートはAPI用の実装になり、Webページ用とは以下の点で異なります。

  • リソースコントローラでは、フォームを表示するアクション(create, edit)が不要。
  • 各アクション(index, show, update, destroy)はJSON形式の文字列を返す。
  • ビューの実装が不要。
  • routes/api.phpファイルにルートを追加する。

実際のアプリケーションでは、認証やバリデーション等の実装も必要になりますが、今回は説明しません。

また、APIリソースを使って作成する方法についても、今回は説明しません。

 

[PR] PHPのプログラミングで挫折しない学習方法を動画で公開中

実際に書いてみよう

例として、Post(投稿)というリソースに対するCRUD操作のAPIを書いてみましょう。

ターミナルでLaravelのartisanコマンドを実行して、マイグレーション、モデル、リソースコントローラの雛形を一気に生成します。

$ php artisan make:model -m -c -r Post

生成されたマイグレーションで、テーブルに必要なカラム(title, contentなど)を定義しておきます。

$table->string('title');
$table->text('content');

ターミナルでLaravelのartisanコマンドを実行して、マイグレーションを適用します。

$ php artisan migrate

モデルで、$fillableプロパティを定義しておきます。複数代入の脆弱性を排除するためです。

// 複数代入可能な属性を指定
protected $fillable = ['title', 'content'];

リソースコントローラの各アクションの中身を実装します。

アクションからEloquentオブジェクトやコレクションなどを返すとJSONに変換されます。

create、editは不要なので削除します。

public function index()
{
    // 投稿を作成日時の新しい順でペジネーションした結果を返す
    return Post::latest()->paginate();
}

public function store(Request $request)
{
    // リクエストパラメータから取得した値をもとにPostを作成する
    return Post::create($request->all());
}

public function show(Post $post)
{
    // Eloquentオブジェクトを返す
    return $post;
}

public function update(Request $request, Post $post)
{
    // リクエストパラメータから取得した値をもとにPostを更新する
    $post->update($request->all());
    return $post;
}

public function destroy(Post $post)
{
    // Eloquentオブジェクトを削除する
    $deleted = $post->delete();
    return compact('deleted');
}

routes/api.phpファイルに、APIリソースルートを追加します。

Route::apiResource('posts', 'PostController');
    
ターミナルでLaravelのartisanコマンドを実行して、このルートを確認してみます。

$ php artisan route:list --path=posts
+--------+-----------+------------------+---------------+---------------------------------------------+------------+
| Domain | Method    | URI              | Name          | Action                                      | Middleware |
+--------+-----------+------------------+---------------+---------------------------------------------+------------+
|        | GET|HEAD  | api/posts        | posts.index   | App\Http\Controllers\PostController@index   | api        |
|        | POST      | api/posts        | posts.store   | App\Http\Controllers\PostController@store   | api        |
|        | DELETE    | api/posts/{post} | posts.destroy | App\Http\Controllers\PostController@destroy | api        |
|        | PUT|PATCH | api/posts/{post} | posts.update  | App\Http\Controllers\PostController@update  | api        |
|        | GET|HEAD  | api/posts/{post} | posts.show    | App\Http\Controllers\PostController@show    | api        |
+--------+-----------+------------------+---------------+---------------------------------------------+------------+

APIの動作を確認するには、Postmanなどのアプリを利用すると便利です。

ここでは、curlコマンドを実行して、APIの動作を確認してみます。出力をjqコマンドで処理すると見易く整形されるため便利です。
以下のような内容のpost.jsonファイルを作成しておきます。

{ "title": "Post 1", "content": “投稿1です。” }

ターミナルで以下のようにcurlコマンドを実行すると、createアクションの動作を確認できます。

$ curl localhost:8000/api/posts -s -H "Content-Type: application/json" --data-binary @post.json | jq
{
  "title": "Post 1",
  "content": "投稿1です。",
  "updated_at": "2018-07-22 07:12:19",
  "created_at": "2018-07-22 07:12:19",
  "id": 1
}

ターミナルで以下のようにcurlコマンドを実行すると、showアクションの動作を確認できます。

    $ curl localhost:8000/api/posts/1 -s | jq
    {

      "id": 1,

      "title": "Post 1",

      "content": "投稿1です。",

      "created_at": "2018-07-22 05:43:59",

      "updated_at": "2018-07-22 05:43:59"

    }

他にもPostをいくつか登録しておきます。

ターミナルで以下のようにcurlコマンドを実行すると、indexアクションの動作を確認できます。

$ curl localhost:8000/api/posts -s | jq
{
  "current_page": 1,
  "data": [
    {
      "id": 2,
      "title": "Post 2",
      "content": "投稿2です。",
      "created_at": "2018-07-22 05:46:44",
      "updated_at": "2018-07-22 05:46:44"
    },
    {
      "id": 1,
      "title": "Post 1",
      "content": "投稿1です。",
      "created_at": "2018-07-22 05:43:59",
      "updated_at": "2018-07-22 05:43:59"
    }
  ],
  "first_page_url": "http://localhost:8000/api/posts?page=1",
  "from": 1,
  "last_page": 1,
  "last_page_url": "http://localhost:8000/api/posts?page=1",
  "next_page_url": null,
  "path": "http://localhost:8000/api/posts”,
  "per_page": 15,
  "prev_page_url": null,
  "to": 2,
  "total": 2
}

post.jsonファイルの内容を以下のように変更しておきます。

{ "title": "Post 1 (updated)", "content": “投稿1です。編集済" }

ターミナルで以下のようにcurlコマンドを実行すると、updateアクションの動作を確認できます。

$ curl localhost:8000/api/posts/1 -s -H "Content-Type: application/json" --data-binary @post.json -X PUT | jq
{

  "id": 1,

  "title": "Post 1 (updated)",

  "content": "投稿1です。編集済",

  "created_at": "2018-07-22 05:43:59",

  "updated_at": "2018-07-22 10:00:33"

}

ターミナルで以下のようにcurlコマンドを実行すると、destroyアクションの動作を確認できます。

$ curl localhost:8000/api/posts/1 -s -X DELETE | jq
{
  "deleted": true
}

以上、ごく簡単なAPIの作成方法を説明しました。

 

この記事を監修してくれた方

杉本 隆也(すぎもとたかや)
フリーランスのアプリケーションエンジニア。

WebアプリやiOSアプリの受託開発をしながら、
TechAcademyではPHP/Laravelコースを担当しています。

開発実績: マッチングサービス、カスタマーサービス、決済ツール、SNSアプリ、音遊びアプリなど。
趣味: 二胡(を始めたい)

 

大石ゆかり

内容分かりやすくて良かったです!

田島悠介

ゆかりちゃんも分からないことがあったら質問してね!

大石ゆかり

分かりました。ありがとうございます!

オンラインのプログラミングスクールTechAcademyではオンラインブートキャンプPHP/Laravelコースを提供しています。

PHPやフレームワークのLaravelを使ってWebアプリケーションの開発を学ぶことができます。

現役エンジニアがパーソナルメンターとして受講生に1人ずつつき、マンツーマンのメンタリングで学習をサポートし、最短4週間で習得することが可能です。

また、現役エンジニアから学べる無料のプログラミング体験会も実施しているので、ぜひ参加してみてください。