📶

Laravel でサクッとAPI サーバーを構築する

2024/12/08に公開

概要

API Platform が Laravel でも正式に使えるようになったようです。
いつか試してみたいなと思っていたところ、
Advent Calendar を書く機会を得たので、話のネタとして試してみました。
https://x.com/ApiPlatform/status/1838848121209598318

💡 API Platform とは...

Symfony をベースとした Web API フレームワークです。
REST API や GraphQL API を瞬時に提供できます。

API サーバーを構築する

検証時のバージョン

PHP:8.3
Laravel:11.3

以下のサイトを参考にしながら構築します。
https://api-platform.com/docs/laravel/

⚠️ Laravel は導入済みの状態とします。

1. API Platform のインストール

composer require api-platform/laravel

2. 設定ファイルの作成とアセット関連の公開

Laravel プロジェクトに API Platform をセットアップするコマンドになります。

php artisan api-platform:install

3. モデルクラスの作成

ここでは公式の通り、Book(本)のモデルクラスを定義します。

php artisan make:model Book
namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Book extends Model
{
    protected $fillable = [
        'isbn',
        'title',
        'description',
        'author',
        'publication_date',
    ];

    protected $casts = [
        'publication_date' => 'date',
    ];
}

4. テーブルの作成

マイグレーションファイルを作成します。

php artisan make:migration create_books_table

作成されたマイグレーションファイルを編集します。

public function up(): void
{
    Schema::create('books', function (Blueprint $table) {
        $table->id();

        $table->string('isbn')->nullable();
        $table->string('title');
        $table->text('description');
        $table->string('author');
        $table->date('publication_date')->nullable();

        $table->timestamps();
    });
}

テーブルを作成します。

php artisan migrate

5. モデルの公開

クラスに #[ApiResource] 属性でマークします。
この属性をつけると、API リソースとして公開されます。

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
+ use ApiPlatform\Metadata\ApiResource;

+ #[ApiResource]
class Book extends Model
{...省略}

API サーバーを起動して検証してみる

1. ローカルのサーバーを起動する

php artisan serve

2. 公開されている API のエンドポイントを確認する

http://127.0.0.1:8000/api/ にアクセスすると、公開されている API のエンドポイントが一覧表示されます。

APIの管理画面

3. 動作確認する

curl コマンド等で 期待するレスポンスが返却されるか確認してください。

例)GETメソッド

以下は 事前に books テーブルへ 1 レコード登録しています。

リクエストの実行

curl -X 'GET' \
  'http://localhost:8000/api/books?page=1' \
  -H 'accept: application/json'

レスポンス結果

[
  {
    "id": 1,
    "isbn": "11-22-33",
    "title": "testTitle",
    "description": "testDescription",
    "author": "testAuthor",
    "publicationDate": "2024-11-22T00:00:00+00:00",
    "createdAt": "2024-11-22T00:00:00+00:00",
    "updatedAt": "2024-11-22T00:00:00+00:00"
  }
]

覚えておきたい設定

ここでは、api-platform.php の設定について説明します。

API 公開するリソースを変更する

デフォルトでは、app/Modelsのパッケージ内が対象になるので、必要に応じて変更してください。
複数ディレクトリの設定も可能です。

// 例
'resources' => [
-    app_path('Models'),
+    app_path('src'),
],

レスポンスのフォーマットを変更する

以下の設定では、JSON-LD(構造化データ)をレスポンスで扱うことはあまりないと思うので、JSON に変更してます。

'formats' => [
-    'jsonld' => ['application/ld+json'],
+    'json' => ['application/json'],
],

まとめ

API サーバーの構築 ~ 動作確認まで 5 分で実現できました! 公式を見ながらですが、こんな簡単にできるとは...

外部 API について業務で触れる機会が増えたので、とてもタイムリーな話題になりました。管理画面も直感的で見やすく扱いやすいので、どこかで重宝するかもしれません。

弊社では他にも面白い記事をたくさん投稿しております。ぜひ見ていってください!

BABY JOB  テックブログ

Discussion