Twigキャッシュあれやこれ

こんにちは。
ぴころじーの竹川です。

私は、メンテナンス性の高さと汎用性の高さから、Drupalでウェブサイトを構築する際、かな~りTwigテンプレートを使います。ほとんどそれじゃない?ってくらい。ユーザーが投稿できる記事以外はそれで書くことが結構あります。

なんでやねん?ビューとか使えば楽じゃない?って思われる方もいらっしゃると思いますが、Twigテンプレートは、ビューの結果や特定のノード、ユーザーなども取り込んで一つにして書くことができるため、ものすごく便利なんですよ。ただ、コードを書くことが嫌いでなければの話です。

そんなすごく便利なTwigテンプレートにも、実は強烈な欠点があります。コレのせいで、使うのを諦めたこともあるほどに。もちろん、この欠点、普段遣いの機能としては必要なのですが、とある1点だけにおいて、使い勝手がガタ落ちするケースがあります。

それは、Twigキャッシュのせいで、コンテンツを投稿しても、すぐに表示に反映されないということなんですね。Twigキャッシュをクリアしてやらなければいけないんですよ・・・。

  1. コンソールからDrush
  2. 管理画面からキャッシュをクリア

といったやり方をしなければいけません。「投稿」ボタンをぽちっと押したら、Twigテンプレートで書いてある一覧などに即座に反映してほしいのに。Twig使いでなければ気にする必要はないのですが、私はTwig使い。しかも重度のです。「投稿」ボタンをぽちっと押したらTwigキャッシュをクリアするモジュールがないかな~、ありそうだよな~・・・と探してもないんですよね。

だから、作りました。めっちゃシンプルなやつです。

実は、Drupalにはイベント(ログインした、とかボタンを押したとか)をフックして、カスタムコードを割り込ませることができます。簡単に申し上げると、投稿ボタンを押したらついでにこの処理もしてね。っていうふうに、です。

とっても簡単なモジュールなので、こちらにおいておきますね。

一応、コードは次のようになっています。

twigcache_clear.info.yml

name: Twig Cache Clear
type: module
description: A custom module to clear Twig cache on node save.
core_version_requirement: ^10

twigcache_clear.module

<?php

function twigcache_clear_form_node_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id) {
 $form['actions']['submit']['#submit'][] = 'twigcache_clear_clear_twig_cache';
}

function twigcache_clear_clear_twig_cache($form, \Drupal\Core\Form\FormStateInterface $form_state) {
 // Clear Twig cache.
 \Drupal::service('cache.render')->invalidateAll();
 \Drupal::service('cache.discovery')->invalidateAll();
}

この2つのファイルを、<root>/web/sites/all/module/twigcache_clear(なければ作成してください。)に配置して、モジュールを有効にするだけ!モジュール名はTwig Cache Clearです。

これを応用すれば、さまざまイベントをフックして処理を割り込ませることができそうです。