PHPのSlim3フレームワークでslim/twig-viewパッケージを使用時、.twigのビューファイルを変更してもブラウザで表示したときに変更内容が反映されないときがあります。これは、twigがビューのファイルを.phpに変換した結果をキャッシュしており、元の.twigを変更してもキャッシュされた.phpのファイルを使用し続けているためです。
この問題を解決するためには、2つ方法があります。
※本記事では、プログラマが作成するビューファイルを.twig、Twigテンプレートエンジンが作成するキャッシュファイルが.phpの拡張子として説明しています
解決方法
1つ目: Twigのauto_reload機能を使う(開発環境向け)
1つ目の解決方法は、Twigが持っているauto_reloadを有効化することです。
auto_reloadを有効化すると、元の.twigファイルが書き換わったときに、Twigのテンプレートエンジンが自動で.phpのキャッシュファイルを削除してくれます。
開発環境の場合は、頻繁にビューのファイルを編集することになるので、auto_reloadをtrueにした方が作業しやすいです。デメリットとしては、ファイルの比較が入る為に実行時のパフォーマンスが落ちることですが、開発中の低いトラフィック環境では無視できるレベルです。
auto_reloadを有効化するためには、以下のように\Slim\Views\Twigクラスのコンストラクタの第二引数で'auto_reload' => trueを指定すればよいです。
# 変更前
$view = new \Slim\Views\Twig(__DIR__ . '/../templates', [
'cache' => __DIR__ . '/../cache'
]);
↓
# 変更後
$view = new \Slim\Views\Twig(__DIR__ . '/../templates', [
'cache' => __DIR__ . '/../cache',
'auto_reload' => true
]);
2つ目: 手動でキャッシュファイルを消す(本番環境向け)
2つ目の解決方法は、*.twigファイルを編集した都度、キャッシュファイルを手動で削除することです。
.phpのキャッシュファイルを削除すれば、twigは再度.twigから*.phpファイルを作成しなおすので、結果的に変更内容が反映されます。本番環境の場合は、本番サーバの負荷を出来るだけ下げたいので、このパターンが良いです。
キャッシュディレクトリは、通常\Slim\Views\Twigのコンストラクタで指定しているかと思います。下記の例ではこの記述があるphpファイルからみて、1つ上のディレクトリにあるcacheがキャッシュの保存場所です。
$view = new \Slim\Views\Twig(__DIR__ . '/../templates', [
'cache' => __DIR__ . '/../cache'
]);
本番サーバにファイルをデプロイする時、自動でキャッシュをクリアできるようなスクリプトを仕込んでおくと、キャッシュのクリア忘れがなくなるので良いです。