icon
icon

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

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

テックアカデミーマガジンは受講者数No.1のプログラミングスクール「テックアカデミー」が運営。初心者向けにプロが解説した記事を公開中。現役エンジニアの方はこちらをご覧ください。 ※ アンケートモニター提供元:GMOリサーチ株式会社 調査期間:2021年8月12日~8月16日  調査対象:2020年8月以降にプログラミングスクールを受講した18~80歳の男女1,000名  調査手法:インターネット調査

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

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

 

そもそもPHPについてよく分からないという方は、PHPとは何なのか解説した記事を読むとさらに理解が深まります。

 

なお本記事は、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を学んで未経験からWebエンジニアを目指す方法とは

実際に書いてみよう

例として、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   | AppHttpControllersPostController@index   | api        |
|        | POST      | api/posts        | posts.store   | AppHttpControllersPostController@store   | api        |
|        | DELETE    | api/posts/{post} | posts.destroy | AppHttpControllersPostController@destroy | api        |
|        | PUT|PATCH | api/posts/{post} | posts.update  | AppHttpControllersPostController@update  | api        |
|        | GET|HEAD  | api/posts/{post} | posts.show    | AppHttpControllersPostController@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を使ってWebアプリケーション開発を習得できるオンラインブートキャンプPHP/Laravel講座を開催しています。

挫折しない学習方法を知れる説明動画や、現役エンジニアとのビデオ通話とチャットサポート、学習用カリキュラムを体験できる無料体験も実施しているので、ぜひ参加してみてください。