自定义 Twig 过滤器和函数可以在 CMS 中使用 插件注册类 的 registerMarkupTags 方法注册。本文描述了如何注册您自己的 Twig 过滤器和函数,这些过滤器和函数可以在 CMS 和邮件模板中使用。
public function registerMarkupTags()
{
return [
'filters' => [
// ...Filters defined here
],
'functions' => [
// ...Functions defined here
]
];
}注册数组中的 filters 键可用于 Twig 过滤器。例如,可以将 |plural 过滤器映射到全局 PHP 函数 str_plural() 并使用以下值。
'filters' => [
'plural' => 'str_plural'
]你也可以传递一个本地方法。例如,|uppercase 可以映射到 $this->makeAllCaps() 方法。
'filters' => [
'uppercase' => [$this, 'makeTextAllCaps']
]这在 Twig 中可用,如下所示。
{{ 'my text'|uppercase }}就像过滤器一样,functions 键可以用来创建 Twig 函数。例如,该函数可以映射到 Form::open() 的静态方法调用。
'functions' => [
'form_open' => [Form::class, 'open']
]静态调用也支持通配符定义。在此示例中,url_foobar() 的函数调用将转换为 Url::foobar 的方法调用,依此类推。
'functions' => [
'url_*' => [Url::class, '*'],
]传递闭包对于任一定义也允许。
'functions' => [
'hello_world' => function() { return 'Hello World!'; }
]这在 Twig 中现已可用,如下所示。
{{ hello_world() }}需要注意的是,自定义 Twig 过滤器和函数默认情况下会进行转义。要禁用默认转义,请在定义中将数组的最后一个值设置为 false。
public function registerMarkupTags()
{
return [
'functions' => [
// Escaped Functions
'input' => 'input',
// Raw Functions
'link_to' => ['link_to', false],
// Escaped Classes
'str_*' => [\Str::class, '*'],
// Raw Classes
'url_*' => [\Url::class, '*', false],
],
'filters' => [
// Escaped Filters
'display_name' => [fn ($user) => $user->getDisplayName()],
// Raw Filters
'avatar_url' => [fn ($user) => $user->getAvatarUrl(), false],
// Escaped Classes
'str_*' => [\Str::class, '*'],
// Raw Classes
'url_*' => [\Url::class, '*', false],
]
];
}除了将最后一个数组值作为 false 传递之外,你也可以将其作为数组传递,以向 Twig 扩展提供自定义选项。这可以包括向函数传递环境和上下文变量。
public function registerMarkupTags()
{
return [
'filters' => [
// Unescaped
'rot13' => ['str_rot13', ['is_safe' => ['html']]],
// Has Environment
'env_filter' => [fn ($env, $string) => '...', ['needs_environment' => true]],
// Has Context
'context_filter' => [fn ($context, $string) => '...', ['needs_context' => true]],
// Has Both
'context_both' => [fn ($env, $context, $string) => '...', [
'needs_environment' => true,
'needs_context' => true
]],
]
];
}