LaravelでAPIを作ってみよう!初心者でもできるRESTful設計の基本

Laravel APIの全体像図 クライアント、ルーティング、コントローラ、モデル、DB、レスポンスの流れを示す図 クライアント (ブラウザ / モバイル / curl) ルーティング routes/api.php コントローラ App\Http\Controllers レスポンス JSON モデル Eloquent Model データベース MySQL / SQLite この図でAPIの主要な流れ(クライアント→ルート→コントローラ→モデル→DB→レスポンス)を把握しよう

Web開発の世界では、アプリケーションを機能ごとに独立させ、連携させる「API(Application Programming Interface)」という考え方が主流になっています。例えば、スマートフォンのアプリが、サーバーから最新のニュース記事を取得したり、SNSで投稿をしたりする際に、APIが裏側で動いています。

「なんだか難しそう…」と感じたかもしれません。特に、初心者や若手エンジニアの方にとって、APIの設計、コントローラやルーティングの設定、そしてRESTfulなルールを理解するのは、少しハードルが高く感じるかもしれません。しかし、ご安心ください。Laravelを使えば、その強力な機能と直感的な設計のおかげで、API開発は驚くほどスムーズに進められます。

この記事では、API開発の入り口に立つあなたを全力でサポートします。まずは、「APIってそもそも何?」「RESTfulって何が便利なの?」といった基本の「キ」から丁寧に解説します。そして、実際に手を動かしながら、シンプルなAPIを一緒に作っていきます。実装のステップごとに、なぜそのコードを書くのか、どんな設計思想があるのかを分かりやすく紐解いていきます。

読み進めていくうちに、API開発への苦手意識が消え、新しいWeb開発の楽しさをきっと見つけられるはずです。この記事が、あなたのプログラミング学習における「次の扉」を開くきっかけになれば幸いです。さあ、一緒にLaravelでAPIの世界に飛び込んでみましょう!🚀

RESTful APIとは?初心者向けにやさしく解説

REST(Representational State Transfer)は、Webの設計様式の一つで、HTTPのメソッド(GET/POST/PUT/PATCH/DELETE)を使ってリソースを操作する考え方です。Laravelはこの設計にとても適しており、ルーティングやコントローラ、ミドルウェアなどが揃っているため、初心者でも実践しやすいフレームワークです。

ポイント: リソース=操作したいデータ(例:users, posts) と考え、HTTPメソッドで操作を分けるのがRESTful設計のコツです。✅

この記事では、API開発の入り口に立つあなたを全力でサポートします。まずは、「APIってそもそも何?」「RESTfulって何が便利なの?」といった基本の「キ」から丁寧に解説します。そして、実際に手を動かしながら、シンプルなAPIを一緒に作っていきます。実装のステップごとに、なぜそのコードを書くのか、どんな設計思想があるのかを分かりやすく紐解いていきます。

読み進めていくうちに、API開発への苦手意識が消え、新しいWeb開発の楽しさをきっと見つけられるはずです。この記事が、あなたのプログラミング学習における「次の扉」を開くきっかけになれば幸いです。さあ、一緒にLaravelでAPIの世界に飛び込んでみましょう!🚀

はじめに準備するもの

  • PHP 8.x がインストールされた環境
  • Composer
  • Laravel 9.x または 10.x(この記事では例として Laravel 10 を想定)
  • エディタ(VSCode など)
  • Postman やcurl でAPIを叩く環境

まずはローカルにLaravelのプロジェクトを作成しましょう。コマンドは次の通りです。

composer create-project laravel/laravel laravel-api-sample
cd laravel-api-sample
php artisan serve

基本のルーティング(routes/api.php)

APIのエンドポイントは routes/api.php に定義します。ここでは “posts” リソースを例に、RESTfulなルーティングを作ってみます。

use App\Http\Controllers\Api\PostController;

Route::apiResource('posts', PostController::class);

この1行で、以下のエンドポイントが自動で作成されます(GET /posts, POST /posts, GET /posts/{id}, PUT/PATCH /posts/{id}, DELETE /posts/{id})。

コントローラの作成と実装

controllerは php artisan make:controller Api/PostController --api で作成します。–api オプションで不要なview関連メソッドを省いたAPI向けコントローラが作れます。

php artisan make:controller Api/PostController --api

実際のコード例(簡易版)を示します。初心者向けにコメントを付けています。

<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use App\Models\Post;
use Illuminate\Http\Request;
use Illuminate\Http\JsonResponse;

class PostController extends Controller
{
    // 一覧取得
    public function index(): JsonResponse
    {
        $posts = Post::orderBy('created_at', 'desc')->get();
        return response()->json(['data' => $posts], 200);
    }

    // 作成
    public function store(Request $request): JsonResponse
    {
        $validated = $request->validate([
            'title' => 'required|string|max:255',
            'body' => 'required|string',
        ]);

        $post = Post::create($validated);
        return response()->json(['data' => $post], 201);
    }

    // 単一取得
    public function show(Post $post): JsonResponse
    {
        return response()->json(['data' => $post], 200);
    }

    // 更新
    public function update(Request $request, Post $post): JsonResponse
    {
        $validated = $request->validate([
            'title' => 'sometimes|required|string|max:255',
            'body' => 'sometimes|required|string',
        ]);

        $post->update($validated);
        return response()->json(['data' => $post], 200);
    }

    // 削除
    public function destroy(Post $post): JsonResponse
    {
        $post->delete();
        return response()->json(null, 204);
    }
}

ポイント: バリデーションは必ず行い、HTTPステータスコードも適切に設定しましょう。✅

「入力エラー」で悩まない!Laravelのフォームバリデーションを完全マスタ…

「入力エラー」で悩まない!Laravelのフォームバリデーションを完全マスタ…

Laravel初心者必見!フォーム入力エラーを防ぐバリデーションの基礎から日本語化まで徹底解説。ルーティングとの関係や実例コード付きで安心して学べます。

Laravel初心者必見!フォーム入力エラーを防ぐバリデーションの基礎から日本語化まで徹底解説。ルーティングとの関係や実例コード付きで安心して学べます。

モデルとマイグレーション

次にモデルとマイグレーションを作ります。Postモデルはシンプルな例です。

php artisan make:model Post -m

作成されたマイグレーションにカラムを追加します。

public function up()
{
    Schema::create('posts', function (Blueprint $table) {
        $table->id();
        $table->string('title');
        $table->text('body');
        $table->timestamps();
    });
}

モデル側(App/Models/Post.php)はfillableを設定しておくとcreate/updateが楽になります。

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    protected $fillable = ['title', 'body'];
}

APIリソース(JSON整形)

そのままモデルを返すのも良いですが、レスポンスを整形するには php artisan make:resource PostResource を使います。

php artisan make:resource PostResource

例: App/Http/Resources/PostResource.php

<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class PostResource extends JsonResource
{
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'title' => $this->title,
            'body' => $this->body,
            'created_at' => $this->created_at->toDateTimeString(),
        ];
    }
}

コントローラで返す時は return new PostResource($post);PostResource::collection($posts) を使います。

認証の基本(APIトークン・Sanctum)

APIでは認証が必要になることが多いです。初心者に扱いやすいのは Laravel Sanctum です。簡単に導入手順を説明します。

  1. composer require laravel/sanctum
  2. php artisan vendor:publish –provider=”Laravel\Sanctum\SanctumServiceProvider”
  3. php artisan migrate
  4. UserモデルにHasApiTokensを追加

ログインしてトークンを発行する例(簡易):

public function login(Request $request)
{
    $user = User::where('email', $request->email)->first();

    if (! $user || ! Hash::check($request->password, $user->password)) {
        return response()->json(['message' => '認証失敗'], 401);
    }

    $token = $user->createToken('api-token')->plainTextToken;
    return response()->json(['token' => $token]);
}

実践:クライアント(curl)で動かしてみる

まずは一覧を取得してみましょう。サーバーが http://localhost:8000 で動いていると仮定します。

curl -X GET http://localhost:8000/api/posts

# 作成
curl -X POST http://localhost:8000/api/posts \
  -H "Content-Type: application/json" \
  -d '{"title":"はじめての投稿","body":"Laravel APIを作りました"}'

JSONが返ってくれば成功です!🎉

スマホで試す場合は、PostmanやREST Client拡張機能が便利です。

テストの書き方(初心者向け)

LaravelはPHPUnitが組み込まれており、APIのテストを書くのも比較的簡単です。サンプルのテストを示します。

public function test_posts_index()
{
    Post::factory()->count(3)->create();

    $response = $this->getJson('/api/posts');

    $response->assertStatus(200)
             ->assertJsonStructure(['data' => [['id','title','body','created_at']]]);
}

ポイント:テストは自動化で安全にリファクタリングできるようにするための保険です。最初は簡単なテストから始めましょう。

よくある間違いと対処法

  • バリデーションを忘れて400系エラーで困る → リクエスト側で必須項目をチェックし、サーバ側でもバリデーションを必須にする
  • 返却するJSONのフォーマットが不統一 → API Resourceを導入して統一する
  • 認証の設定ミスで誰でも操作できてしまう → ミドルウェアで保護(auth:sanctum など)

実務目線のちょっと上級ポイント

  • レスポンスのバージョン管理(例:/api/v1/posts)を早めに考える
  • Rate Limiting(レート制限)でDoS対策を行う
  • ログ・監視(Laravel Telescopeや外部サービス)を導入する
  • DTOやサービス層を導入してコントローラを薄くする

FAQ(よくある質問)

A: WebアプリはHTMLを返してブラウザで表示する一方、APIはJSONなどのデータを返して別のクライアント(SPAやモバイル)が消費する点が違います。

A: 公開データ以外は必須です。ユーザー情報や書き込みを扱うAPIは必ず認証を入れましょう(Sanctumが初心者には扱いやすいです)。

A: 一般的にはmultipart/form-dataで送信し、ストレージに保存。Presigned URLを発行してS3に直接アップロードする方式もよく使われます。

まとめ

ここまで、LaravelでRESTfulなAPIを作るための基本設計から実装、認証、テスト、よくある間違いまでを解説しました。初心者が迷いやすいポイントに絞って丁寧に説明したので、まずは小さなCRUD APIを作ってみることをおすすめします。実際に手を動かすことで設計の意味が腑に落ち、次のステップへ進めます。がんばってください!💪