はじめに
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化する記事が見つからなかったため、ぜひ参考にしてみてください。