18

什么时候应该将某些功能创建为过滤器而不是函数,反之亦然?

user | function

对比

function(user)

有人指出了文档,但是它没有解释何时使用哪个。它确实这样说:

函数支持与过滤器相同的功能,但 pre_escape 和 preserves_safety 选项除外。

如果它们的行为就像一个过滤器,那么树枝支持功能有什么意义?

4

2 回答 2

29

过滤器是一种转换显示数据的方法。例如,如果你想显示一个变量的内容L1K3 Th1s,你必须写一个filter(例子{{ username|l33t }}:)

当您需要计算事物以呈现结果时,使用函数。例如,{{ dump(username) }}将在内部调用var_dumpphp 函数的函数。

通常,当您需要做更重的事情时,您通常会编写一个函数,而不仅仅是以简单的方式转换内容的显示。

于 2013-09-18T08:25:56.533 回答
0

我想补充一点,在您要执行的代码没有您可以从 Twig 模板中提供的输入的情况下,函数可能更有意义。

假设您想在基于用户代理检测到不受支持的浏览器时显示警告。假设您手头没有保存用户代理的变量,您可以使用TwigFunction这样的:

{% if not supportedBrowser() %} ... {% endif%}

如果您确实在当前 Twig 范围内的任何变量中都提供了用户代理,则可以使用过滤器并像这样调用它:

{% if not app.request.headers.get('user-agent')|supportedBrowser %} ... {% endif %}

如果您的 Twig 模板在 Symfony 应用程序中运行,上述方法将起作用。


话虽如此,如果您将用户代理放在局部变量中,过滤器可能不是最好的方法。您可以编写一个Twig 测试并像这样使用它:

{% if app.request.headers.get('user-agent') is not supportedBrowser %} ... {% endif %}

我知道这偏离了最初的问题,但我认为在考虑“A 或 B”时了解“C”选项很重要。

作为个人意见,在这个特定的上下文中使用 Twig 测试更容易阅读/理解,因为它将底层逻辑转换为简单的语言。

于 2021-10-25T00:01:02.283 回答