Laravel 13系で外部APIにリクエストし、結果をキャッシュする方法
Laravelから祝日一覧APIにリクエストして結果をファイルキャッシュさせたい。また、キャッシュした内容をJSONで出力したり、他のコントローラー等で配列として受け取りたい。以下に対応方法をメモ。
対応方法
キャッシュ設定
.envを以下の通り変更する。
# 変更前 CACHE_STORE=database # 変更後 CACHE_STORE=file
コントローラーの作成
サーバにSSH接続して以下でコントローラーを作成する。
pa make:controller HolidayController
「/app/Http/Controllers/HolidayController.php」を以下の通り編集してアップする。
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Log;
class HolidayController extends Controller
{
/**
* キャッシュから(なければAPIから)祝日データを配列で取得
*/
public function fetchHolidaysData()
{
$apiUrl = 'https://holidays-jp.github.io/api/v1/date.json';
$cacheKey = 'holidays_data';
return Cache::remember($cacheKey, now()->addMonths(1), function () use ($apiUrl) {
$response = Http::get($apiUrl);
if ($response->failed()) {
throw new \Exception('APIの取得に失敗しました。');
}
return $response->json();
});
}
/**
* JSONを出力
*/
public function index()
{
try {
$data = $this->fetchHolidaysData();
return response()->json($data);
} catch (\Exception $e) {
Log::error($e->getMessage());
return response()->json(['error' => '祝日データの取得に失敗しました。'], 500);
}
}
}
キャッシュの有効期限設定
上記ソースコード上では「addMonths(1)」として1ヶ月に指定しているが、他にも以下のように指定できる。
- now()->addMinutes(30) : 30分間
- now()->addHours(12) : 12時間
- now()->addDays(3) : 3日間
- now()->addWeeks(4) : 4週間
- now()->addMonths(4) : 4ヶ月間
詳細はCarbonのリファレンスを参照。
動作確認用ファイル
「/routes/web.php」に以下を追記する。
use App\Http\Controllers\HolidayController;
// JSONとして出力
Route::get('holiday_json', [HolidayController::class, 'index']);
// 配列を受け取ってdump
Route::get('holiday_array', function () {
$holiday = new HolidayController();
dump($holiday->fetchHolidaysData());
});
ブラウザから「/holiday_json」にアクセスするとJSON出力、「holiday_array」にアクセスすると配列がdump出力される点が確認できる筈。
他コントローラー等から呼び出す場合は配列として使用する。
補足
キャッシュの保存場所
「/storage/framework/cache/data」ディレクトリ以下に保存される。
キャッシュの削除
以下コマンドで削除。
pa cache:clear
リファレンス
HTTP クライアント
https://laravel-jp.toolboxforweb.xyz/docs/http-client
キャッシュ
https://laravel-jp.toolboxforweb.xyz/docs/cache
Carbon
関連記事
-
-
Laravel 13系でMailpitに対してテキスト・HTMLメールを送信する方法
Laravel 13系でMailpitに対してテキスト・HTMLメールを送信した ...
-
-
Laravel 13系でエラーログ設定と出力及び確認方法
Laravelのエラーログはデフォルト設定だと同じファイルに無制限に追記していく ...
-
-
Podmanコンテナ環境のLaravelのキャッシュクリア方法
Laravelで何らかのファイルを編集し、アップロードしてもうまく動かない場合が ...
-
-
Laravelのディレクトリ構造・バージョン・DB接続情報確認
Laravelで作成されているシステムに携わることがあった。しかしながら当方La ...
-
-
Laravel 13系でエラーログをブラウザ上で表示・検索できる「log-viewer」の導入方法
先日Laravel 13系でエラーログ設定を行ったが、このログをブラウザ上で表示 ...