勉強したことのメモ

Webエンジニア / プログラマが勉強したことのメモ

Laravel 13系で外部APIにリクエストし、結果をキャッシュする方法

  PHP Laravel

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

https://carbon.nesbot.com/develop/reference.html

 - PHP Laravel

  関連記事

Laravel 13系でMailpitに対してテキスト・HTMLメールを送信する方法
Laravel 13系でMailpitに対してテキスト・HTMLメールを送信する方法

Laravel 13系でMailpitに対してテキスト・HTMLメールを送信した ...

Laravel 13系でエラーログ設定と出力及び確認方法
Laravel 13系でエラーログ設定と出力及び確認方法

Laravelのエラーログはデフォルト設定だと同じファイルに無制限に追記していく ...

Podmanコンテナ環境のLaravelのキャッシュクリア方法
Podmanコンテナ環境のLaravelのキャッシュクリア方法

Laravelで何らかのファイルを編集し、アップロードしてもうまく動かない場合が ...

Laravelのディレクトリ構造・バージョン・DB接続情報確認
Laravelのディレクトリ構造・バージョン・DB接続情報確認

Laravelで作成されているシステムに携わることがあった。しかしながら当方La ...

Laravel 13系でエラーログをブラウザ上で表示・検索できる「log-viewer」の導入方法
Laravel 13系でエラーログをブラウザ上で表示・検索できる「log-viewer」の導入方法

先日Laravel 13系でエラーログ設定を行ったが、このログをブラウザ上で表示 ...