Twigのカスタム関数・フィルターの作り方を徹底解説!初心者向けSymfonyテンプレート講座
生徒
「Twigで独自の関数やフィルターって作れますか? 既存のじゃ足りなくて…」
先生
「はい、Twigではカスタム関数やフィルターを自分で定義することができます。表示を自由にコントロールできますよ。」
生徒
「でも関数とかフィルターって難しそうです…初心者でも作れますか?」
先生
「もちろんです。実際の例を使いながら、やさしく説明していきますね!」
1. Twigのカスタム関数・フィルターとは?
まず、Twigでいう「関数」とは、テンプレートの中で何か特別な処理をしたいときに使う命令のことです。そして「フィルター」とは、変数の内容を変換・加工するための仕組みです。
例えば「文字を大文字にする」「日付をフォーマットする」など、Twigには既に多くのフィルターが用意されていますが、自分でオリジナルのフィルターや関数も追加できるのです。
2. カスタムTwig拡張クラスの作成
Symfonyでは、Twigの拡張機能を作るには、TwigExtensionクラスを作成して、サービスとして登録します。
まず、次のようなクラスを作成してみましょう。
namespace App\Twig;
use Twig\Extension\AbstractExtension;
use Twig\TwigFunction;
use Twig\TwigFilter;
class AppExtension extends AbstractExtension
{
public function getFunctions(): array
{
return [
new TwigFunction('greeting', [$this, 'greetingFunction']),
];
}
public function getFilters(): array
{
return [
new TwigFilter('reverse', [$this, 'reverseFilter']),
];
}
public function greetingFunction(string $name): string
{
return 'こんにちは、' . $name . 'さん!';
}
public function reverseFilter(string $text): string
{
return strrev($text);
}
}
ここでは、greeting関数と、reverseフィルターの2つを定義しています。これでTwigテンプレート内から使用できるようになります。
3. サービスとして登録しよう(自動登録)
Symfony 4以降では、自動的にTwigにサービスが登録されるため、特別な設定は不要です。ただし、サービスファイルにあるservices.yamlで自動登録が有効になっていることは確認しましょう。
# config/services.yaml
services:
App\Twig\:
resource: '../src/Twig'
tags: ['twig.extension']
これで、Twig内から自作した関数・フィルターが使えるようになります。
4. Twigテンプレートでカスタム関数を使う
では、先ほど作成したgreeting関数をTwigで実際に使ってみましょう。
<p>{{ greeting('太郎') }}</p>
これは「こんにちは、太郎さん!」というメッセージを出力します。独自の挨拶機能など、表示内容を自由に変えたいときに便利です。
5. Twigテンプレートでカスタムフィルターを使う
次に、reverseというフィルターを使って、文字列を逆さに表示する例です。
<p>{{ 'Symfony'|reverse }}</p>
このように書くと、ymonfSのように文字が反転して表示されます。文章や文字列の加工処理を入れたいときに非常に便利です。
6. カスタムTwig機能の活用例
カスタム関数やフィルターを使うことで、次のような場面でTwigテンプレートをより便利にできます。
- 会員名の敬称付け(例:「様」「さん」など)
- 郵便番号や電話番号のフォーマット処理
- 改行文字をHTMLの
<br>に変換 - 特定キーワードのハイライト表示
複雑な処理はPHP側で書いて、Twigではシンプルに表示に集中できるように設計できます。
7. Twigでの命名と注意点
カスタム関数・フィルターを作るときは、次のような点に注意しましょう。
- 関数名・フィルター名はわかりやすく:処理の内容が伝わる名前にすること。
- 変数の型に注意:文字列だけでなく配列などを扱うときは型チェックをしましょう。
- 共通ロジックの再利用:同じ処理が何度もあるならTwig拡張で一元化すると便利です。