LaravelでAPIを作成する方法!

Laravel Laravel

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フォルダ配下に配置します。
Laravelで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つ作成しました。
createfetchupdatedeleteです。

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_idMemberモデルを取得しています。
その後にdeleteメソッドを呼ぶことで、対象のテーブルのデータが削除されます。

$member = Member::find($request->member_id);
$member->delete();
return response()->json();

Memberモデルには論理削除の設定を行なっているので、deleted_atに削除日付が入ります。
リクエスト元に対しては、レスポンスとしては何も返していません。

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引数に指定した配列のMemberControllercreateメソッドで処理をします。

routes/api.phpで作成したルーティングにはURLでデフォルトで/apiがつきます。

実際のURLはLaravelがローカルで動く場合だと
http://localhost/api/member にPOST形式でアクセスすると、MemberControllercreateメソッドが動く」ということになります。

それぞれ同様にして、下記のように3つのルートを作成しています。

・`/api/member`に`GET`形式でアクセスすると、`fetch`メソッドが動く
・`/api/member`に`PUT`形式でアクセスすると、`update`メソッドが動く
・`/api/member`に`DELETE`形式でアクセスすると、`delete`メソッドが動く

動作確認する

それではPostmanから動作確認してみます。
今回はLaravelの環境に `http://127.0.0.1:8000` でアクセスできるようにしました。

最初にデータを追加してみます。
/api/memberに下記のようにアクセスします。
リクエストがJSON形式でmembersテーブルに入れたい値を書いています。
LaravelのAPIでPOSTアクセス

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

テーブルを見ると、このようにデータが入っていることが確認できました。
LaravelのAPIでPOSTアクセスした結果(テーブル)

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

このように、作成したデータが返ってきました。
LaravelのAPIでGETアクセスした結果

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

テーブルを確認すると、更新されています。
LaravelのAPIでPUTアクセスした結果

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

テーブルを確認すると、削除されています。
(論理削除なので、deleted_atのカラムが更新されています)
LaravelのAPIでDELETEアクセスした結果

終わりに

今回はLaravelを使用して、データベースのテーブルに対して、追加・取得・更新・削除の4つの操作を行いました。
URLは同じにしましたが、HTTPでアクセスするときの形式で処理を切り替えました。

今回は最低限の設定だけ行なって、簡単なAPIを作成しました。
実際に作るときには、バリデーションやデータが取れなかった時なども想定して作成する必要があるかと思います。

コメント

タイトルとURLをコピーしました