更新 2015 年 5 月 14 日
评论者指出我大部分都是错的。如果您确实需要一个函数,而不是过滤器或宏,您可以这样做Twig 文档中建议 https://twig.symfony.com/doc/2.x/advanced.html#functions:
$twig = new Twig_Environment($loader);
$function = new Twig_SimpleFunction('blah', function () {
// ...
});
$twig->addFunction($function);
并使用像
{{ blah() }}
简而言之,不,这是不可能的。
然而,希望并没有消失!
Filters
如果这个功能blah()
你的意思是修改一个现有的变量,那么它是一个filter.
一个例子:
//in your PHP
function format_date($date_string,$format_string) {
return date($format_string,strtotime($date_string));
}
$twig_env->addFilter('format_date',new Twig_Filter_Function('format_date'));
{# in your template #}
{{ some_date|format_date('n/j/Y') }}
(第一个参数是您要过滤的变量,第二个参数是通过正常方式提供的)
Macros
如果,正如您上面所指出的,您的函数只是输出 HTML,那么它是一个很好的候选者macro.
一个例子:
{# in your template #}
{% macro say_hello() %}
<p>Oh! Hello, world!</p>
{% endmacro %}
{# ... later on ... #}
{{ _self.say_hello() }}
或者带参数:
{% macro input(name,value,type) %}
<input type="{{ type|default('text') }}" name="{{ name }}" value="{{ value }}">
{% endmacro %}
{{ _self.input('phone_number','867-5309') }}
{{ _self.input('subscribe','yes','checkbox') }}
Why?
要记住的是 Twig 模板代表view,就MVC而言。这意味着它们在环境方面是孤立的,只能代表context您通过传入的数据数组传递它们$template->render()
method.
这是一件好事,因为它将您的演示文稿与逻辑和数据解耦。如果你可以任意调用函数,那么你会突然增加耦合,这是一个bad thing.
造成这种情况的另一个原因是 PHP 处理回调的方式。考虑一下如何将该函数传递到模板中......可能是这样的:
function blah() {
return "<p>Oh! Hello, world!</p>";
}
$template = $twig_env->loadTemplate('template.html');
echo $template->render(array('blah'=>'blah'));
在您的模板中,上下文变量blah
现在只是一个包含的字符串'blah'
.罢工>
在普通 PHP 中,当您使用像这样的变量函数时(尝试像函数一样使用字符串变量),它(或多或少)会执行该函数的查找,然后调用它。你是not传递函数,只是它的名称。
问题是,你不可能将函数传递到模板中,因为 PHP 执行此操作的唯一机制是通过名称字符串,一旦进入模板,该名称就不再是函数名称而只是一个字符串。
有点啰嗦,但希望对您有所帮助!
如果您需要更多文档,官方文档是here https://twig.symfony.com/doc/2.x/templates.html.