【Laravel】サクッとRest APIを実装する


即興でLaravelアプリをローカルホストで立ち上げて、
リクエストを受け取ったらDBからデータを取得してjsonを返却する方法

Laravelのインストール

composerを使ってインストール

composer create-project --prefer-dist laravel/laravel api-test

.envの修正

DB接続のために、以下を修正する
※ MySQL等のDBサーバが立ち上がっていることが前提

.env
DB_CONNECTION=mysql
-DB_HOST=127.0.0.1
+DB_HOST={接続対象ホスト}
DB_PORT=3306
-DB_DATABASE=homestead
+DB_DATABASE={接続対象DBスキーマ名}
-DB_USERNAME=homestead
+DB_USERNAME={接続対象DBユーザ名}
-DB_PASSWORD=secret
+DB_PASSWORD={接続対象DBパスワード}

手動で.envファイルを作成しようとしたら、composerを使ってインストールした場合は、いつの間にか自動で作成されるようになったんですね。便利な世の中になりました。

DB接続用のモデル作成

以下コマンドを実行

php artisan make:model News

必要に応じて、生成されたapp/News.phpを修正する
参考:https://readouble.com/laravel/5.8/ja/eloquent.html

APIコントローラの作成

以下コマンドを実行

php artisan make:controller NewsController --resource

--resourceのオプションをつけると、作成されるコントローラに一般的なCRUD用のアクションを自動生成してくれる
参考:https://readouble.com/laravel/5.8/ja/controllers.html#resource-controllers

生成したコントローラを、以下のように編集する

app/Http/Controllers/NewsController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
+use App\News;

class NewsController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
-        //
+        return response(News::all());
    }

// ... 略

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
-        //
+        return response(News::find($id));
    }

ルーティングの設定

routes/api.php
Route::resource('news', 'NewsController');

動作確認

以下コマンドを実行し、ローカルホストでWebサーバを立ち上げる
(Laravel標準のビルドインサーバ機能を利用)

$ php artisan serve
Laravel development server started: <http://127.0.0.1:8000>

表示されたURLにapi/newsをつけてアクセスすると、NewsControllerのindexアクションが呼び出され、newsテーブルの全件データがjsonで返却される
http://127.0.0.1:8000/api/news

以下のようにapi/news/{id}とアクセスすると、NewsControllerのshowアクションが呼び出され、任意のidのみ抽出したjsonが返却される
http://127.0.0.1:8000/api/news/10650


即興で作ったが、ちゃんとテストコードも書きたい