目前我将我的函数放在一个类中,并将这个类的一个实例传递给模板,并将我需要的函数作为类方法调用。
{{ unneededclass.blah() }}
我需要像下面那样做
{{ blah() }}
有可能吗?
最佳答案
2015 年 5 月 14 日更新
评论者指出我大部分是错的。如果你真的需要一个函数,而不是过滤器或宏,你可以像 suggested in the Twig docs 那样做:
$twig = new Twig_Environment($loader);
$function = new Twig_SimpleFunction('blah', function () {
// ...
});
$twig->addFunction($function);
然后像这样使用
{{ blah() }}
简而言之,不,这是不可能的。
然而,希望并没有落空!
过滤器
如果您的这个函数 blah()
旨在修改现有变量,那么它就是一个过滤器。
一个例子:
//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') }}
(第一个参数是您要过滤的变量,第二个参数是通过正常方式提供的)
宏
如果正如您在上面指出的那样,您的函数只是输出 HTML,那么它很适合宏。
一个例子:
{# 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') }}
为什么?
要记住的是,Twig 模板代表一个 View ,就 MVC 而言。这意味着它们在环境方面是孤立的,并且只能表示您通过在 $template->render()
方法中传递的数据数组传递给它们的上下文 .
这是一件好事,因为它将演示与逻辑和数据分离。如果您可以任意调用函数,那么您会突然增加耦合,这是一件坏的事情。
另一个原因是 PHP 处理回调的方式。想想你将如何将该函数传递到你的模板中......可能是这样的:
function blah() {
return "<p>Oh! Hello, world!</p>";
}
$template = $twig_env->loadTemplate('template.html');
echo $template->render(array('blah'=>'blah'));
在您的模板中,上下文变量 blah
现在只是一个包含 'blah'
的字符串。
在 vanilla PHP 中,当您像这样使用变量函数(尝试像函数一样使用字符串变量)时,它(或多或少)会执行对该函数的查找,然后调用它。您没有传递函数,只是它的名称。
问题是,你不可能将一个函数传递到模板中,因为 PHP 唯一的机制是通过名称字符串来执行此操作,一旦进入模板,该名称就不再是函数名称,而只是一个字符串。
有点啰嗦,但希望对您有所帮助!
如果您需要更多文档,官方文档是 here .
关于php - twig - 将函数传递给模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3595727/