Laravel PHPでRESTful APIを構築する方法
読む所要時間: 19 分
ソーシャルネットワークから銀行アプリケーションまで、現代社会は多くのAPIで動いています。本稿では、Laravel PHPを使ってRESTful APIと、それを実装するアプリケーションを構築する方法について学びます。
必要条件
このチュートリアルでは、PHP言語とLaravelフレームワークの基本的な知識と、以下の項目が必要です。
- PHP 7.1以降
- Composer
- MySQL
- Laravel 5.6以降
- Postman
作成するアプリケーションについて
本稿では、学生に関するデータを取り扱うCRUD APIを構築します。CRUDは、Create(作成)、Read(読み取り)、Update(更新)、Delete(削除)を意味します。このAPIには、次のエンドポイントがあります。
GET /api/students
は、すべての学生レコードを返し、GET
リクエストを受け入れます。GET /api/students/{id}
は、学生レコードのid
を参照して学生レコードを返し、GET
リクエストを受け入れます。POST /api/students
は、新しい学生レコードを作成し、POST
リクエストを受け入れます。PUT /api/students/{id}
は、学生レコードのid
を参照して既存の学生レコードを更新し、PUT
リクエストを受け入れます。DELETE /api/students/{id}
は、学生レコードのid
を参照して学生レコードを削除し、DELETE
リクエストを受け入れます。
学生レコードには、name
とcourse
のみが詳細情報として含まれます。これらのエンドポイントの開発が完了したら、エンドポイントを使用して、実際の学生レコードに関するデータを取り扱うアプリケーションを開発します。
Laravelアプリケーションの設定をする
まず、Laravelアプリケーションを作成する必要があります。これを行うには、ターミナルで次のコマンドを実行します。
次に、以下のコマンドで現在のディレクトリをプロジェクトのルートフォルダに変更します。
Laravelサーバーがまだ実行されていない場合は、以下のコマンドでLaravelサーバーを起動します。
アプリケーションにはhttps://localhost:8000からアクセスできます。
次に、以下のコマンドを実行し、アプリケーションの新しいデータベースを作成します。
MySQLで認証する際に、すでにパスワードを設定している場合は、MySQLパスワードを入力するように求められます。次のコマンドを実行し、api-project
という名前の新しいデータベースを作成します。
移行しながらモデルの作成を進めることができます。これを行うには、次のコマンドを実行します。
Student.php
という名前の新しいファイルがapp
ディレクトリに作成されます。
注: ファイルを編集して、対話したいデータベーステーブルと書き込み可能なフィールドを指定する必要があります。
さらに、移行ファイルがdatabase/migrations
ディレクトリに作成され、テーブルが生成されます。移行ファイルを変更し、文字列値を受け入れるname
とcourse
の列を作成します。
次に、テキストエディタでプロジェクトフォルダを開き、.envファイルを以下のように変更して適切なデータベース認証情報を入力できるようにします。これにより、作成したデータベースにアプリケーションを正しく接続できます。
次に、以下のコマンドを使用して、移行を実行します。
ルートを設定する
アプリケーションの基本を設定したら、次のコマンドを実行して、APIのメソッドが含まれるコントローラーの作成を進めます。
app\http\controllers
ディレクトリに、ApiController.php
ファイルがあります。以下のメソッドを追加します。
routes
ディレクトリに進み、api.php
ファイルを開き、ApiController
で作成済みのメソッドを参照するエンドポイントを作成します。
エンドポイントに渡されるデータを取得するには、Laravelリクエストクラスを使用します。エンドポイントでは、string
型のname
とstring
型のcourse
も必要になります。データを正常に取得できたら、データベースにデータを保存します。
上記のスニペットでは、データベースのstudents
テーブルと対話するStudent
モデルをインポートします。createStudent
メソッドでは、メソッドパラメーターの新しいRequest
オブジェクトをインスタンス化し、続いてStudent
オブジェクトをインスタンス化します。最後に、$student->
ごとに同等のリクエストが取得され、保存されます。
操作が成功すると、student record created
メッセージとレスポンスコード201
でJSONレスポンスがAPIユーザーに返信されます。
このメソッドは、routes/api.php
にあるルートのファイルにあらかじめ定義したため、すでに/api/students
に紐付けられています。
テストする
テストする前に、アプリケーションが実行されていることを確認します。前述のように、ビルトインのコマンドを使用できます。
成功メッセージと201
レスポンスコードが返されれば正常です。次のタスク用に、データベースに後数件、レコードを追加してみてください。
すべての学生レコードを返す
次に、ApiController
のgetAllStudents
メソッドを編集します。
すでにインポートしたStudent
モデルを使用し、データベースのすべての学生を返すためのシンプルなEloquentクエリを作成します。
Eloquentクエリは->toJson(JSON_PRETTY_PRINT);
で終わります。Eloquentで返されるオブジェクトデータが、適切に書式設定されたJSONにシリアル化されます。JSONはレスポンスコード200
と共に返されます。
このメソッドは、routes/api.php
にあるルートのファイルにあらかじめ定義したため、すでに/api/students
ルートに紐付けられています。
上のスクリーンショットに示すように、エンドポイントはデータベースのすべての学生レコードを返します。
学生レコードを返す
単一の学生レコードのみを返すためのエンドポイントを作成します。ApiController
のgetStudent
メソッドを使います。
学生レコードのid
で学生レコードを取得し、これに対して、その学生レコードのid
で学生レコードを返すためのEloquentクエリを作成します。
前述のスニペットは、指定したid
の学生レコードが存在するかどうかをチェックします。存在する場合は、Eloquentを使用してデータベースにクエリを実行し、id
と一致するレコードをJSON形式にて、レスポンスレコード200
と共に返します。指定したid
がデータベースで見つからない場合、student not found
メッセージと404
レスポンスコードを返します。
このメソッドは、routes/api.php
にあるルートのファイルにあらかじめ定義したため、すでに/api/students/{id}
ルートに紐付けられています。
上のスクリーンショットに示すように、http://api-project.test/api/students/3
にリクエストを実行し、そのid
に割り当てられた学生の詳細が返されました。次に、存在しない学生レコードをリクエストします。
上のスクリーンショットに示すように、id
が100
の存在しない学生レコードの詳細を要求するリクエストがエンドポイントに送信されました返されました。APIが正常に実行され、エラーメッセージと404
ステータスコードが返されました。
学生レコードを更新する
次に、既存の学生レコードの詳細を更新するためのエンドポイントを作成します。ApiController
のupdateStudent
メソッドを使います。
これを行うには、更新しようとしているレコードが存在するかどうかを確認する必要があります。存在する場合、指定したid
と一致するレコードが更新され、ステータスコード204
が返されます。存在しない場合、レコードが見つからないことを示すメッセージとステータスコード404
が返されます。
name
またはcourse
のいずれかの属性のみを更新する必要がある場合に備えて、検証を追加しています。リクエストを受け取ると、name
またはcourse
がnull
かどうかをチェックします。null
の場合は、データベースのレコードをを既存の値に置き換えます。null
でない場合は、null
が新しい値として渡されます。これはすべて三項演算子を使用して実行されます。
注: 三項演算子の形式はcondition ? true : false
です。
このメソッドは、routes/api.php
にあるルートのファイルにあらかじめ定義したため、すでに/api/students/{id}
ルートに紐付けられています。
次のようなレコードが返されます。
次に、/api/students/1
にPUT
リクエストを実行し、course
を「Software Engineering」に変更します。PUT
リクエストを実行するには、form-data
経由でJSONペイロードを渡します。さらに、name
の値をTrojan Okoh
、course
の値を「Software Engineering」に変更します。
前述のスニペットはJSONペイロードで、レコードの更新に使用します。次に示すように、Postmanを開いてraw
に変更し、型をJSON(application/json)
に変更します。
次に、JSONペイロードをテキスト領域に貼り付け、エンドポイントにPUT
リクエストを送信します。
上のスクリーンショットに示すように、エンドポイントが成功メッセージを返しました。次に、/api/students/1
にGETリクエストを実行し、レコードが実際に更新されたかどうかを確認します。
学生レコードを削除する
最後に、学生レコードを削除するには、ApiController
のdeleteStudent
メソッドを使います。
Eloquentを使用して、削除リクエストの対象となるレコードのid
が存在するかどうかを確認します。存在する場合は、レコードを削除します。存在しない場合は、not found
メッセージと404
ステータスコードを返します。
このメソッドは、routes/api.php
にあるルートのファイルにあらかじめ定義したため、すでに/api/students/{id}
ルートに紐付けられています。
次に、/api/students/{id}
にDELETE
リクエストを実行します。{id}
は、削除リクエストをするレコードのid
です。ここでは、テスト目的でid
が2
のレコードを削除します。
リクエストが受け入れられたことを意味するステータスコード202
と成功メッセージがエンドポイントから返されました。レコードが実際に削除されたかどうかを確認するには、/api/students
エンドポイントにGET
リクエストを実行し、データベースにあるすべての学生レコードをリストします。
上のスクリーンショットに示すように、id
が2
のレコードはもう存在しません。また、/api/students/{id}
エンドポイントにGET
リクエストを実行し、id
が2
のレコードをリクエストして確認することもできます。レコードが見つからなかったことを示す404
が返されます。
routes\web.php
app\Student.php
Laravelを使用して、簡単なCRUD RESTful APIを構築できました。本稿では、Laravelを使ったCRUD RESTful APIの構築の基本について説明しましたが、リクエストの検証とAPIセキュリティについては取り上げませんでした。ぜひ、本稿をもとにリクエスト検証も試してみてください。
Twitter: [@ichtrojan](https://twitter.com/ichtrojan)
GitHub: [@ichtrojan](https://github.com/ichtrojan)
メール: michael@okoh.co.uk