有没有办法在调用之前检查Twig过滤器是否存在?

时间:2018-02-04 00:51:55

标签: symfony twig twig-filter

有没有办法在调用之前检查Twig过滤器是否存在?

在使用过滤器之前,我定义的条件似乎并不重要,我总是得到同样的错误:

  

'未知" myFilter" 。过滤器'

{% if not true %}
  {{ 'Hello World'|myFilter }}
{% endif %}

1 个答案:

答案 0 :(得分:3)

当您尝试使用未定义的过滤器时,总是会遇到Twig_Error_Syntax异常,即使您在问题中无法到达的地方进行此操作也是如此。对于函数也是如此,请参阅Check if a custom Twig function exists and then call it

您可以创建自定义函数来检查是否存在过滤器。但你仍然无法编写这样的代码:

{% if filter_exists('myFilter') %}
  {{ 'Hello World'|myFilter }}
{% endif %}

相反,您还需要创建另一个函数,以便您有这样的东西:

{% if filter_exists('myFilter') %}
  {{ call_filter('Hello World', 'myFilter') }}
{% endif %}

这样,如果过滤器不存在,您将无法获得异常。

创建这些方法非常简单:

$twig->addFunction(new Twig_Function('filter_exists', function(Twig_Environment $env, $filter) {
    return $env->getFilter($filter) !== false;
}, ['needs_environment' => true]));

$twig->addFunction(new Twig_Function('call_filter', function(Twig_Environment $env, $input, $filter, ...$args) {
    return $env->getFilter($filter)->getCallable()($input, ...$args);
}, ['needs_environment' => true]));

或者根据您的需要,您也可以将两者合并,以便在过滤器不存在的情况下按原样返回输入:

$twig->addFunction(new Twig_Function('call_filter_if_it_exists', function(Twig_Environment $env, $input, $filter, ...$args) {
    $filter = $env->getFilter($filter);

    if ($filter === false) {
        return $input;
    }

    return $filter->getCallable()($input, ...$args);
}, ['needs_environment' => true]));

然后在Twig:

{{ call_filter_if_it_exists('Hello World', 'myFilter', 'first arg', 'second arg') }}