経緯
以前の記事で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を開いてみて下さい。
↓の画面が開くはずです。

自分のPC内で起動した仮想的なサーバにアクセスして開いている状態です。インターネット上にデプロイした画面を開いている訳ではありません。
この状態でAPIを作成してみて、ローカル環境で動くことを確認してからインターネット上にデプロイして最終的な確認をする事にしましょう。
コントローラの作成
まずはコントローラーを作成します。普通にファイルを作成するのではなく、artisanに作ってもらいましょう。
php artisan make:controller でコントローラファイル作成
Laravelプロジェクトのディレクトリ直下で以下のコマンドを実行しましょう。
php artisan make:controller 【作成するコントローラー名】 --api
例↓
php artisan make:controller HeboheboController --api
コマンドが正しく実行できると「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()
{
//
}
// 不要なメソッドを削除
}
コントローラに処理を追加
コントローラの骨格が出来ました。続いて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
上手く行けばWebブラウザの画面上に↓の結果が表示されるはずです。作成したコントローラのindexメソッドでreturnしていたJsonですね。
{"blogTitle":"\u3059\u306e\u3050\u3089","author":"suno"}
エラーページが表示される場合
以下のようなエラーページが表示されてしまう場合は表示されている内容をよく読んでエラーの原因を探りましょう。
↓の画像の場合、
Target class [App\Http\Controllers\HeboController] does not exist.
とあるので、「HeboControllerなんてファイル存在してないぞ」ということですね。

本記事で作成したコントローラーは「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ブラウザで開いたものと違い、こちらはインターネット上のページを開いています。

では、アドレスバーに書かれたURLの末尾に今回作成したAPIのパスを追加してみましょう。
https://【Herokuアプリ名】.herokuapp.com/api/hebo
上手く行っていればローカルで確認した時同様、コントローラーのreturnで指定したJSONがWebブラウザ上で表示されるはずです。

コメント