是否可以检查给定变量是否为Twig
中的字符串?
预期解决方案:
messages.en.yml
:
hello:
stranger: Hello stranger !
known: Hello %name% !
Twig
模板:
{% set title='hello.stranger' %}
{% set title=['hello.known',{'%name%' : 'hsz'}] %}
{% if title is string %}
{{ title|trans }}
{% else %}
{{ title[0]|trans(title[1]) }}
{% endif %}
有可能这样做吗?或许你有更好的解决方案?
答案 0 :(得分:108)
可以使用twig1.7中添加的测试iterable
来完成,正如Wouter J在评论中所述:
{# evaluates to true if the foo variable is iterable #}
{% if users is iterable %}
{% for user in users %}
Hello {{ user }}!
{% endfor %}
{% else %}
{# users is probably a string #}
Hello {{ users }}!
{% endif %}
参考:iterable
答案 1 :(得分:10)
好的,我是这样做的:
{% if title[0] is not defined %}
{{ title|trans }}
{% else %}
{{ title[0]|trans(title[1]) }}
{% endif %}
丑陋,但有效。
答案 2 :(得分:8)
我发现iterable
不够好,因为其他对象也可以迭代,并且明显不同于array
。
因此,添加新Twig_SimpleTest
以检查项is_array
是否更明确。您可以在启动twig后将其添加到您的应用配置中。
$isArray= new Twig_SimpleTest('array', function ($value) {
return is_array($value);
});
$twig->addTest($isArray);
用法变得非常干净:
{% if value is array %}
<!-- handle array -->
{% else %}
<!-- handle non-array -->
{% endif % }
答案 3 :(得分:2)
无法使用框中的代码正确检查它。
最好创建自定义TwigExtension
并添加自定义检查(或使用OptionResolver
中的代码)。
因此,对于Twig 3
,结果会像这样
class CoreExtension extends AbstractExtension
{
public function getTests(): array
{
return [
new TwigTest('instanceof', [$this, 'instanceof']),
];
}
public function instanceof($value, string $type): bool
{
return ('null' === $type && null === $value)
|| (\function_exists($func = 'is_'.$type) && $func($value))
|| $value instanceof $type;
}
}
答案 4 :(得分:-1)
假设您知道一个值始终是字符串或数组的事实:
{% if value is iterable and value is not string %}
...
{% else %}
...
{% endif %}
在我正在从事的项目中,这对我来说已经足够好了。我知道您可能需要其他解决方案。