0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Laravel 11で外部API呼び出しメソッドをMock化する方法

Last updated at Posted at 2024-08-26

はじめに

Laravelで外部APIと連携するアプリケーションを開発する際、外部APIの準備が整っていなかったり、APIの利用制限があるためなるべく通信したくない、などの理由で、ローカル環境での開発やテスト実行時に実際に外部APIを呼び出したくない場合があると思います。

そこで今回は、Laravelで外部API呼び出し処理をMock化する方法を紹介します。
この方法を使うことで、外部APIのレスポンスを擬似的に再現し、開発やテストをスムーズに進めることができます。

前提条件

  • PHP 8.3.7
  • Laravel Framework 11.14.0

実装手順

APIサービスの作成

まずは、実際に外部APIにリクエストを送信するサービスクラスを作成します。
今回は呼び出し元でステータスコードを利用できるように、JsonResponse型で返していますが、配列など任意の型で実装できます。
その場合は、Mockクラスのメソッドの戻り値も合わせて変更してください。

// app/Services/ApiService.php

<?php

namespace App\Services;

use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Http;

class ApiService
{
    public function fetchData(array $param = null): JsonResponse
    {
        // 外部APIのエンドポイント
        $apiUrl = 'https://api.example.com/data';

        // APIリクエストを送信
        $response = Http::get($apiUrl, $param);

        return response()->json($response->json(), $response->status());
    }
}

APIサービスのMockの作成

上記で作成したAPIサービスクラスを拡張してMockクラスを作成します。

// app/Services/ApiServiceMock.php

<?php

namespace App\Services;

use App\Services\ApiService;
use Illuminate\Http\JsonResponse;

class ApiServiceMock extends ApiService
{
    public function fetchData(array $param = null): JsonResponse
    {
        $data = [
            'id' => 1,
            'name' => 'Test Data',
        ];

        return response()->json($data, 200);
    }
}

サービスプロバイダの作成

新しく独自のプロバイダを作成しても大丈夫です。
今回は、既存のAppServiceProviderに追記して説明します。

// app/Providers/AppServiceProvider.php

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use App\Services\ApiService;
use App\Services\ApiServiceMock;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     */
    public function register(): void
    {
        if (config('is_api_mock')) {
            // 実行環境など任意の条件
            $this->app->bind(ApiService::class, function () {
                return new ApiServiceMock();
            });
        }
    }

    /**
     * Bootstrap any application services.
     */
    public function boot(): void
    {
        //
    }
}

プロバイダで実際のメソッドを呼ぶか、Mockのメソッドを呼ぶか判定しています。
今回は環境変数を利用していますが、任意の条件を指定してください。

プロバイダの登録

独自のプロバイダで作成した場合で自動で追加されていない場合は、以下の配列に追加してください。

// bootstrap/providers.php

<?php

return [
    App\Providers\AppServiceProvider::class,
];

コントローラーの作成

// app/Http/Controllers/ApiController.php

<?php

namespace App\Http\Controllers;

use App\Services\ApiService;
use Illuminate\Http\Request;

class ApiController extends Controller
{
    protected $apiService;

    public function __construct(ApiService $apiService)
    {
        $this->apiService = $apiService;
    }

    public function index(Request $request)
    {
        $response = $this->apiService->fetchData($request->input('param'));

         // 任意の処理
        return $response;
    }
}

おわりに

本記事では、Laravelで外部API呼び出しをMock化する方法を紹介しました。
Laravel 11で外部APIを呼び出すメソッド自体をMock化する記事が見つからなかったため、ぜひ参考にしてみてください。

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?