PHP
CSS
js
laravel
blade

Laravel cssやjsにタイムスタンプを付けてキャッシュを更新させる

Laravelでcssやjsを変更した際にブラウザのキャッシュを更新させる方法です。

かんたんに使いまわせるようにBlade拡張でディレクティブを作成します。

AppServiceProvider.php
public function boot()
    {
        \Blade::directive('addtimestamp', function ($expression) {
            $path = public_path($expression);

            try {
                $timestamp = \File::lastModified($path);
            } catch (\Exception $e) {
                $timestamp = Carbon::now()->timestamp;
                report($e);
            }

            return asset($expression) . '?v=' . $timestamp;
        });
    }

bladeの中ではこのように使います。
<link rel="stylesheet" href="@addtimestamp(css/index.css)" />

このように出力されます。

<link rel="stylesheet" href="https://example.com.jp/css/index.css?v=1521625069" />

注意点

bladeは最初の表示でキャッシュされるので、2回目以降は@addtimestampは読み込まれません。
cssだけ更新してもタイムスタンプは変わらないので、php artisan view:clearなどでキャッシュをクリアしてください。
Jenkinsなどでリリースしている場合は、キャッシュをクリアするコマンドを追加するとよいと思います。