今回はTwigの拡張機能を作成する方法をご紹介します。
Twig Tweakという便利なモジュールもありますが、
それでも物足りない場合には、カスタムモジュールを作成することで
Twigテンプレート内で使用する関数やフィルターを簡単に追加することができます。
作成するモジュール
今回は画面上に「Hello xxx」と出力するTwig関数say_hello
を作成します。
作成するカスタムモジュールは以下のような構成になります。
sample_twig_extension
├── sample_twig_extension.info.yml
├── sample_twig_extension.services.yml
└── src
└── TwigExtension.php
各ファイルの紹介
sample_twig_extension.info.yml
info.yml
ファイルについては、特別なことはなく通常のカスタムモジュール作成と同様に書いていただければ問題ありません。
詳細はこちらをご参照ください。
TwigExtension.php
Twigの拡張機能を定義するためのクラスです。 先に全体像をお見せします。
<?php
namespace Drupal\sample_twig_extension;
use Twig\Extension\AbstractExtension;
use Twig\TwigFunction;
/**
* Twig拡張サンプル.
*/
class TwigExtension extends AbstractExtension {
/**
* {@inheritdoc}
*/
public function getName() {
return 'sample_twig_extension';
}
/**
* {@inheritdoc}
*/
public function getFunctions() {
return [
new TwigFunction('say_hello', [$this, 'sayHello']),
];
}
/**
* Hello.
*
* @param string $name
* 名前.
*
* @return string
* Hello 名前
*/
public function sayHello($name) {
return "Hello ${name}";
}
}
それでは詳細を見ていきましょう。
このクラスはTwig\Extension\AbstractExtension
クラスを継承する必要があります。
/**
* Twig拡張サンプル.
*/
class TwigExtension extends AbstractExtension {
続いてTwig関数を定義するためにgetFunctions
を実装します。
getFunctions
は親クラスであるAbstractExtension
(厳密にはExtensionInterface
)で定義されている関数で、追加したい関数のリストを返します。
/**
* {@inheritdoc}
*/
public function getFunctions() {
return [
new TwigFunction('say_hello', [$this, 'sayHello']),
];
}
戻り値はTwigFunction
クラスの配列である必要があります。
TwigFunction
コンストラクタの第1引数には、Twig内で使用する関数名を指定します。今回はsay_hello
としています。
第2引数には、Twig関数が呼ばれた際に実行する関数を指定します。
グローバル関数名を直接指定したり、無名関数を指定したりすることもできますが、今回はTwigExtension
クラスのsayHello
関数を指定しています。
ちなみにgetFunctions
という名前の通り、複数の関数を一度に定義することが可能です。複数を定義した場合は以下のようになります
/**
* {@inheritdoc}
*/
public function getFunctions() {
return [
new TwigFunction('say_hello', [$this, 'sayHello']),
new TwigFunction('say_bye', [$this, 'sayBye']),
];
}
最後に実際に処理を行うsayHello
関数を定義します。と言っても今回は単純なテキストを出力するだけなので、以下のようになります。
/**
* Hello.
*
* @param string $name
* 名前.
*
* @return string
* Hello 名前
*/
public function sayHello($name) {
return "Hello ${name}";
}
以上でTwigExtension.phpの作成は終了です。
sample_twig_extension.services.yml
先ほどTwigExtension.phpを作成しましたが、まだこの段階ではモジュールを有効化してもsay_hello
関数を使用できるようにはなりません。TwigExtension.phpがTwigの拡張機能であるということをシステムに伝える必要があります。
services.yml
はそのためのファイルです。
services:
sample_twig_extension.twig_extension: # 任意の識別子
class: Drupal\sample_twig_extension\TwigExtension # Twig拡張を提供するクラス
tags:
- { name: twig.extension } # Twigの拡張として認識させるためのタグ(!ここは変更してはいけない)
最も大切な部分がtags
です。
tags
を{ name: twig.extension }
としないとTwigの拡張機能として認識してもらえないので要注意です。
以上でカスタムモジュールの作成は完了です。
モジュールを有効化して、twig内で
{{ say_hello('Drupal') }}
とすると、画面上にHello Drupal
と出力されることが確認できるかと思います。
まとめ
いかがでしたでしょうか。
作成するファイル数も少ないので、それほどハードルも高くないかと思います。
機会がありましたら是非お試しください。
募集しています
スタジオ・ウミは「Drupal」に特化したサービスを提供する Drupal のエキスパートチーム。
フルリモート&フレックス制だから、働く場所を選ばず時間の使い方も自由です。
そんなワークライフバランスの整った環境で、当ブログに書かれているような
様々な技術を共に学びながら、Drupalサイト開発に携わってみたい方を募集しています。
まずはお話だけでも大歓迎!ぜひお気軽にご連絡ください。