Laravelで簡単なRestAPIを実装する

Laravel ミニマムなGET APIを作る Laravel

経緯

以前の記事でLravelの環境構築をしてHerokuにデプロイしたついでに、超単純なRestAPIを実装しました。(↓こちらの記事の続き)

上記記事ではHerokuにデプロイしていますが、Herokuかどうかは全く関係ないので、Laravelであれば参考にしていただいて問題ないかと思います。

ModelとかRequestには触れず、かなりミニマムな構成のAPIを作っているので、まずは最小限の動きを把握したいという型向けの記事になっています。

ローカルサーバの起動

今回はローカルのソースコードを修正しつつ動作確認をしたいので、Laravelプロジェクトのディレクトリ直下で↓のコマンド実行してローカルサーバを起動しておきましょう。

$ php artisan serve

このコマンドを実行すると、ローカルPC上でLaravelのサーバが立ち上がります。コマンドを実行するとPowershellは以下のような状態になっているはずです。

$ php artisan serve
Starting Laravel development server: http://127.0.0.1:8000
[Sun May 22 11:15:36 2022] PHP 7.4.11 Development Server (http://127.0.0.1:8000) started

この状態でWebブラウザを開き↓のURLを開いてみて下さい。

http://127.0.0.1:8000

↓の画面が開くはずです。

ローカルでlaravelサーバを立ち上げてWebブラウザで開く

自分のPC内で起動した仮想的なサーバにアクセスして開いている状態です。インターネット上にデプロイした画面を開いている訳ではありません。

この状態でAPIを作成してみて、ローカル環境で動くことを確認してからインターネット上にデプロイして最終的な確認をする事にしましょう。

コントローラの作成

まずはコントローラーを作成します。普通にファイルを作成するのではなく、artisanに作ってもらいましょう。

php artisan make:controller でコントローラファイル作成

Laravelプロジェクトのディレクトリ直下で以下のコマンドを実行しましょう。

php artisan make:controller 【作成するコントローラー名】 --api

例↓

php artisan make:controller HeboheboController --api

コントローラーのファイル名の最後は必ずControllerで終わる名前にしましょう。
命名規則から外れるとLaravelさんが上手く認識してくれなくなります。

コマンドが正しく実行できると「Controller created successfully.」と出力されます。

作成されたコントローラーはLaravelプロジェクト内の以下のディレクトリに作成されているはずです。

【Laravelプロジェクトのディレクトリ】\app\Http\Controllers\HeboheboController.php

作成されたファイルを開いて中身を見てみましょう。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class HeboheboController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        //
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        //
    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        //
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        //
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        //
    }
}

make:controllerをする時に –api オプションをつけたのですでにメソッドが色々作られています。今回はindexメソッドだけを使う予定なのでそれ以外のメソッドは削除してしまいましょう。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class HeboheboController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        //
    }

    // 不要なメソッドを削除
}

–apiと似たオプションで -r (–resource) があります。

-r には –api の時に作成されるメソッドに加え、create、editという2つのメソッドが作られますが、これらはAPIとしては使い道が無いため、APIを作成するためであれば –api オプションの方が適しています。

コントローラに処理を追加

コントローラの骨格が出来ました。続いてindexメソッドの中身を実装していきましょう。

とは言え、とりあえず本記事はLaravelのAPIの流れを作るだけなので、適当なJsonをreturnするだけにしましょう。(グレーの行を編集)

実際はここでDBからデータを取得したり、あれこれ処理を書いたりすることになります。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class HeboheboController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        // とりあえず適当にJsonを返却
        return response()->json(['blogTitle' => 'すのぐら', 'author' => 'suno']);
    }
}

ルーティングの追加

コントローラーは作りました。

続いて、Laravelにリクエストがあった時、どんなパスが指定されたらどのコントローラ(のメソッド)が呼び出されるかの定義をするルーティングのルールを記載します。

ルーティング用のファイルは↓の場所にあります。

routes\api.php

中身を見てみると↓の様になっています。すでに何か入っていますね。

<?php

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;

/*
|--------------------------------------------------------------------------
| API Routes
|--------------------------------------------------------------------------
|
| Here is where you can register API routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| is assigned the "api" middleware group. Enjoy building your API!
|
*/

Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
    return $request->user();
});

こちらに今回新しく追加したいAPIの呼び出し元と呼び出し先を紐づけるルールを追加します。

↓のグレーの行を追加して下さい。

<?php

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;

/*
|--------------------------------------------------------------------------
| API Routes
|--------------------------------------------------------------------------
|
| Here is where you can register API routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| is assigned the "api" middleware group. Enjoy building your API!
|
*/

Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
    return $request->user();
});

Route::get('/hebo', [App\Http\Controllers\HeboheboController::class, 'index']);

作成したAPIをローカル環境で動作確認

ファイルを保存したら冒頭で用意したWebブラウザのアドレスバーに以下のURLを入力してEnterキーを押下してみて下さい。

http://127.0.0.1:8000/api/hebo

/hebo の部分はapi.phpでRoute::getの第一引数に指定していた文字列です。
また、↑のURLの「/api」の部分を忘れると404エラーになってしまうのでご注意下さい。

上手く行けばWebブラウザの画面上に↓の結果が表示されるはずです。作成したコントローラのindexメソッドでreturnしていたJsonですね。

{"blogTitle":"\u3059\u306e\u3050\u3089","author":"suno"}

エラーページが表示される場合

以下のようなエラーページが表示されてしまう場合は表示されている内容をよく読んでエラーの原因を探りましょう。

↓の画像の場合、

Target class [App\Http\Controllers\HeboController] does not exist.

とあるので、「HeboControllerなんてファイル存在してないぞ」ということですね。

Laravelエラー

本記事で作成したコントローラーは「HeboheboController」なのでapi.phpでのクラス名の指定が誤っているということでした。

ファイル名を正しく修正すれば上手くいくはずです。

heroku にデプロイしてみる

ローカル環境で動くようになったのでHerokuにデプロイしてみましょう。

$ git add .
$ git commit -m "add test api"
$ git push heroku master

git push コマンドが終了した時に↓の様に出力されていれば成功です。

remote: Verifying deploy... done.
To https://git.heroku.com/sunogura-laravel-api.git

Heroku上にデプロイされた画面を表示してみましょう。

$ heroku open

Laravelのデフォルトページが開くはずです。冒頭でWebブラウザで開いたものと違い、こちらはインターネット上のページを開いています。

HerokuにデプロイしたLaravelのトップページにアクセス

では、アドレスバーに書かれたURLの末尾に今回作成したAPIのパスを追加してみましょう。

https://【Herokuアプリ名】.herokuapp.com/api/hebo

上手く行っていればローカルで確認した時同様、コントローラーのreturnで指定したJSONがWebブラウザ上で表示されるはずです。

コメント

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