アイキャッチ画像: デスクの上でパソコンを使用している

こんにちは。久しぶりのブログ投稿となります、スタジオウミの久保田です。
先日Drupalの認定試験であるアクイア認定プログラムのDrupal 8認定トラック全試験に合格し、グランドマスターとなることができました!
弊社では3人目のグランドマスターとなります!

2020年6月3日にDrupal 9のリリースが予定されていますね。
Drupal 8からDrupal 9への変更点の1つとして、Twigが1系から2系にアップデートされます。
今回はTwig2系へのアップデートに伴い、対応が必要となる変更点をご紹介します。

なお本記事の内容はDrupal.orgのPreparing for use of Twig2 in Drupal 9を意訳したものになります。

Twigとは

TwigとはSymfonyフレームワークの一部であるPHPのテンプレートエンジンです。
Drupal 8からデフォルトのテンプレートエンジンとして採用されました。

Drupal 7までのPHP Templateと比較して、記述がシンプルであることに加え、
出力値がデフォルトでサニタイズされることや、テンプレートファイルからデータベースへのアクセスが制限されているなど
セキュリティ面でもメリットがあります。

Twigについてのより詳細な情報はこちらをご参照ください。

Twig1からTwig2への主な変更点

それではTwig1からTwig2の主な変更点をご紹介します。

テンプレートファイル内の記述に関する変更

テンプレートファイル(*.html.twig)内の記述において、対応が必要となる変更は以下の通りです。

macroの明示的なインポート

Twig1では親テンプレートファイル内でインポートされたmacroは子テンプレートでも使用することができました。
Twig2からは子テンプレートファイルでも明示的にインポートする必要があります。

未定義ブロックの表示エラー

未定義のブロックを表示しようとするとTwig2からは例外を投げるようになります。
そのためブロックを表示する前にif文でブロックが定義されているかどうか確認する必要があります。
※ここでいうblockとはTwigの機能であるblockのことであり、Drupalのブロックとは別物です

{% if block('ブロック名') is defined %}
  {{ block('ブロック名')}} 
{% endif %} 

rawタグの廃止

HTML文字列をエスケープせずに出力する{% raw %}タグは、すでにTwig1系で非推奨となっていました。
Twig2系からはエラーとなるので、{% verbatim %}タグで置き換える必要があります。
rawフィルター(ex. {{ foo|raw }})は引き続き使用可能です。

sameasとdivisiblebyの非推奨化

関数sameasdivisiblebyは非推奨になり、代わりにsame asdivisible byを使用する必要があります。

ちなみにsameasは変数が指定された値と同値かどうかを検証する関数、divisible byは変数が指定された値で割り切れるかどうかを検証する関数です

グローバル変数 _self の出力内容変更

Twig1系以降、グローバル変数の_selfを通して、\Twig\Templateインスタンスにアクセスすることは非推奨となりました。
Twig2では{{ _self }}が現在のテンプレート名を出力するようになるため、{{ _self.templateName }}としていた箇所を{{ _self }}に置き換える必要があります。

モジュール開発者に影響する変更

カスタムフィルターなどのTwigの拡張機能をモジュール等で提供している場合は、以下も対応が必要になります。

拡張機能削除メソッドの廃止

Twig1系以降、拡張機能を削除する機能は非推奨となっていますが、Twig2で\Twig\Environment::removeExtension()メソッドが削除されます。

関数追加に関連するクラス、インタフェースの削除

Twig1系以降、関数を追加するために\Twig\TwigFunctionクラスを使用することとなっています。
関数を追加するために従来使用することができた以下のクラスおよびインタフェースはTwig2で削除されます。

  • Twig_FunctionInterface
  • Twig_FunctionCallableInterface
  • Twig_Function
  • Twig_Function_Function
  • Twig_Function_Method
  • Twig_Function_Node

フィルター追加に関連するクラス、インタフェースの削除

Twig1系以降、フィルターを追加するために\Twig\TwigFilterクラスを使用することとなっています。
フィルターを追加するために従来使用することができた以下のクラスおよびインタフェースはTwig2で削除されます。

  • Twig_FilterInterface
  • Twig_FilterCallableInterface
  • Twig_Filter
  • Twig_Filter_Function
  • Twig_Filter_Method
  • Twig_Filter_Node

まとめ

Twig1からTwig2への変更点についてご紹介しました。

大半が非推奨であった機能の削除ですので、それほど大きな影響を与える変更はない印象です。 今後も非推奨の記述は使用を控え、いずれ来るアップデートに備えておきましょう。

最後に、今回ご紹介した内容はUpgrade Statusモジュールを使用してチェックすることができるようなので、こちらも合わせてお試しください。