php - twig - 将函数传递给模板

标签 php function inheritance twig template-engine

目前我将我的函数放在一个类中,并将这个类的一个实例传递给模板,并将我需要的函数作为类方法调用。

{{ 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/

相关文章:

php - Woocommerce 购物车优惠券值(value)占位符更改

php项目在windows上工作但在linux上不工作

php - mysqli_insert_id : What if someone inserts another row just before I call this?

Javascript call() & apply() vs bind()?

python - 根据参数在运行时自定义函数

php - 将 Drupal 网站从版本 8.7 升级到 9.3

c - 数组到函数 C

c++ - 虚函数和双重继承

c++ - C++中的私有(private)继承以及如何重用但修饰基类的运算符?

javascript - Javascript 中的 Object.create(null) 和创建新的顶级对象