检查变量是否为Twig中的字符串或数组

时间:2012-12-14 09:38:47

标签: twig

是否可以检查给定变量是否为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 %}

有可能这样做吗?或许你有更好的解决方案?

5 个答案:

答案 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 %}

在我正在从事的项目中,这对我来说已经足够好了。我知道您可能需要其他解决方案。