Laravelを使って、APIを作成する方法を書いています。
今回作成するAPIはテーブルに対して、追加・取得・更新・削除(CRUD)を行います。
簡単なAPIの説明の後にコントローラーを作成して、ルートを追加した後に、Postmanからリクエストしてみます。
データベースにはsqliteを使っていて、載せているサンプルコードはLaravelのバージョン8で書いています。
WebのAPIとは?
APIは「Application Programming Interface」の略です。
Wikipediaには下記のように記載があります。
広義ではソフトウェアコンポーネント同士が互いに情報をやりとりするのに使用するインタフェースの仕様である。
APIだけで言うと、ソフトウェア部品同士が情報をやり取りするものみたいな感じです。
Web上でAPIといわれるものは、URLに対してリクエストすると、サーバー上で処理を行なって結果を返してくれるものになります。
FacebookやTwitter,Googleなど有名なサービスがAPIを公開していて、サービスに対しての操作をAPIを使用して行えるようになっています。
例えば、郵便番号検索APIというものが、こちらに公開されています。
郵便番号を渡すと、レスポンスがJSON形式で返ってきます。
`https://zipcloud.ibsnet.co.jp/api/search?zipcode=8100001`にアクセスすると、下記のように結果を返してくれます。
{
"message": null,
"results": [
{
"address1": "福岡県",
"address2": "福岡市中央区",
"address3": "天神",
"kana1": "フクオカケン",
"kana2": "フクオカシチュウオウク",
"kana3": "テンジン",
"prefcode": "40",
"zipcode": "8100001"
}
],
"status": 200
}
zipcodeパラメータに渡す内容を変えると、郵便番号に合わせた住所を取得できます。
このようにWebのAPIはURLに対してリクエストして、何らかのレスポンスを返したり処理を行なってくれるものです。
テーブルを作成する

モデルとテーブルの作成までを行なってください。
コントローラーを作成する
モデルとテーブルの用意ができたら、APIとしてリクエスト受けて処理をしてくれるコントローラーを作成します。
下記のartisanコマンドでコントローラーが作成できます。
$ php artisan make:controller MemberController
Controller created successfully.
コントローラーを作成したら、下記のようにAPIフォルダ配下に配置します。

そのままでも良いのですが、わかりやすいようにAPIディレクトリ配下にしました。
作成したapp/Http/Controllers/Api配下のMemberController.phpファイルを下記のように編集します。
<?php
namespace App\Http\Controllers\Api;
use Illuminate\Http\Request;
use App\Models\Member;
use App\Http\Controllers\Controller;
class MemberController extends Controller
{
/**
* メンバー作成.
*
* @param Request $request
* @return void
*/
public function create(Request $request) {
$member = Member::create([
'name' => $request->name,
'gender' => $request->gender,
'age' => $request->age,
'address' => $request->address,
'tel' => $request->tel,
]);
return response()->json($member);
}
/**
* メンバー取得.
*
* @param Request $request
* @return void
*/
public function fetch(Request $request) {
$member = Member::find($request->member_id);
return response()->json($member);
}
/**
* メンバー更新.
*
* @param Request $request
* @return void
*/
public function update(Request $request) {
$member = Member::find($request->member_id);
$member->update([
'name' => $request->name,
'gender' => $request->gender,
'age' => $request->age,
'address' => $request->address,
'tel' => $request->tel,
]);
return response()->json($member);
}
/**
* メンバー削除.
*
* @param Request $request
* @return void
*/
public function delete(Request $request) {
$member = Member::find($request->member_id);
$member->delete();
return response()->json();
}
}
解説
MemberControllerを作成して、メソッドを4つ作成しました。
create・fetch・update・deleteです。
createメソッド
createメソッドでは送られてきたリクエストをmembersテーブルに保存します。
Memberモデルのcreateメソッドを使用することにより、保存できます。
$member = Member::create([
'name' => $request->name,
'gender' => $request->gender,
'age' => $request->age,
'address' => $request->address,
'tel' => $request->tel,
]);
このように連想配列を渡すことによって保存しています。
受け取ったリクエストのそれぞれデータをテーブルカラムにそのまま入れて保存しているイメージです。
保存した後の状態になったモデルが$member変数に返ってきます。
下記のように書くことで、リクエスト元に対して、JSON形式でレスポンスを返します。
return response()->json($member);
レスポンスで返すのは、作成した$member変数の値です。
fetchメソッド
fetchメソッドでは、Memberクラスのfindメソッドを使用して、送られてきたmembersテーブルのidからMemberモデルを取得しています。
リクエスト元に対して、取得できた内容をJSON形式で返しています。
$member = Member::find($request->member_id);
return response()->json($member);
updateメソッド
updateメソッドでは、fetchメソッドの時と同様にfindメソッドでMemberモデルを取得した後にupdateメソッドを使用しています。
$member = Member::find($request->member_id);
$member->update([
'name' => $request->name,
'gender' => $request->gender,
'age' => $request->age,
'address' => $request->address,
'tel' => $request->tel,
]);
createメソッドと同様に連想配列でカラムと値を定義することにより更新ができます。
左側のキーがカラム名で、右側の値がカラムに入れる値になります。
updateメソッドも、リクエスト元に対して、更新した内容をJSON形式で返しています。
deleteメソッド
deleteメソッドでも、まずfindメソッドでmember_idのMemberモデルを取得しています。
その後にdeleteメソッドを呼ぶことで、対象のテーブルのデータが削除されます。
$member = Member::find($request->member_id);
$member->delete();
return response()->json();
Memberモデルには論理削除の設定を行なっているので、deleted_atに削除日付が入ります。
リクエスト元に対しては、レスポンスとしては何も返していません。
Eloquentについては、下記にも記載しているので気になる方は確認してみてください。

APIのルートを作成する
ブラウザからアクセスして使用する場合のルーティングはroutes/web.phpに記載しました。
APIとしてアクセスする場合のルーティングはroutes/api.phpに記載します。
今回は、下記のようにルートを作成しました。
<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\Api\MemberController;
// memberのCRUD
Route::post('member', [MemberController::class, 'create']);
Route::get('member', [MemberController::class, 'fetch']);
Route::put('member', [MemberController::class, 'update']);
Route::delete('member', [MemberController::class, 'delete']);
最初に追加するためのルーティングを書いています。
Route::post('member', [MemberController::class, 'create']);
Routeクラスのpostメソッドなので、POST形式のHTTPリクエストを受け付けます。
第1引数の/memberにアクセスすると、第2引数に指定した配列のMemberControllerのcreateメソッドで処理をします。
routes/api.phpで作成したルーティングにはURLでデフォルトで/apiがつきます。
実際のURLはLaravelがローカルで動く場合だと
「http://localhost/api/member にPOST形式でアクセスすると、MemberControllerのcreateメソッドが動く」ということになります。
それぞれ同様にして、下記のように3つのルートを作成しています。
・`/api/member`に`PUT`形式でアクセスすると、`update`メソッドが動く
・`/api/member`に`DELETE`形式でアクセスすると、`delete`メソッドが動く

動作確認する
それではPostmanから動作確認してみます。
今回はLaravelの環境に `http://127.0.0.1:8000` でアクセスできるようにしました。
最初にデータを追加してみます。
/api/memberに下記のようにアクセスします。
リクエストがJSON形式でmembersテーブルに入れたい値を書いています。

結果として、下記のように返ってきます。
作成されたデータにidが振られていることが確認できます。

テーブルを見ると、このようにデータが入っていることが確認できました。

次にmembersテーブルのデータを取得してみます。
同じURLにGET形式でアクセスします。作成したデータはidが1なので、member_idが1でリクエストしています。

このように、作成したデータが返ってきました。

次に更新してみます。同じURLにPUT形式でアクセスします。
POSTの時と同じようなリクエストですが、更新のためmember_idを含めています。

テーブルを確認すると、更新されています。

同じURLにDELETE形式でアクセスします。

テーブルを確認すると、削除されています。
(論理削除なので、deleted_atのカラムが更新されています)

終わりに
今回はLaravelを使用して、データベースのテーブルに対して、追加・取得・更新・削除の4つの操作を行いました。
URLは同じにしましたが、HTTPでアクセスするときの形式で処理を切り替えました。
今回は最低限の設定だけ行なって、簡単なAPIを作成しました。
実際に作るときには、バリデーションやデータが取れなかった時なども想定して作成する必要があるかと思います。

コメント