什么时候应该将某些功能创建为过滤器而不是函数,反之亦然?
user | function
对比
function(user)
有人指出了文档,但是它没有解释何时使用哪个。它确实这样说:
函数支持与过滤器相同的功能,但 pre_escape 和 preserves_safety 选项除外。
如果它们的行为就像一个过滤器,那么树枝支持功能有什么意义?
过滤器是一种转换显示数据的方法。例如,如果你想显示一个变量的内容L1K3 Th1s
,你必须写一个filter
(例子{{ username|l33t }}
:)
当您需要计算事物以呈现结果时,使用函数。例如,{{ dump(username) }}
将在内部调用var_dump
php 函数的函数。
通常,当您需要做更重的事情时,您通常会编写一个函数,而不仅仅是以简单的方式转换内容的显示。
我想补充一点,在您要执行的代码没有您可以从 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 测试更容易阅读/理解,因为它将底层逻辑转换为简单的语言。