有没有办法在调用之前检查 Twig 过滤器是否存在?
Is there a way to check if a Twig filter exists before calling it?
有没有办法在调用之前检查 Twig 过滤器是否存在?
似乎在使用过滤器之前定义什么条件并不重要,我总是得到同样的错误:
'Unknown "myFilter" filter.'
{% if not true %}
{{ 'Hello World'|myFilter }}
{% endif %}
当您尝试使用未定义的过滤器时,您总是会遇到 Twig_Error_Syntax
异常,即使您在问题中这样无法访问的地方也是如此。对于函数也是如此,请参阅 .
您可以创建自定义函数来检查过滤器是否存在。但是你还是不能这样写代码:
{% 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') }}
有没有办法在调用之前检查 Twig 过滤器是否存在?
似乎在使用过滤器之前定义什么条件并不重要,我总是得到同样的错误:
'Unknown "myFilter" filter.'
{% if not true %}
{{ 'Hello World'|myFilter }}
{% endif %}
当您尝试使用未定义的过滤器时,您总是会遇到 Twig_Error_Syntax
异常,即使您在问题中这样无法访问的地方也是如此。对于函数也是如此,请参阅
您可以创建自定义函数来检查过滤器是否存在。但是你还是不能这样写代码:
{% 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') }}