Check if variable is string or array in Twig

后端 未结 4 552
暗喜
暗喜 2020-12-24 10:29

Is it possible to check if given variable is string in Twig ?

Expected solution:

messages.en.yml:

hello:
  stranger         


        
相关标签:
4条回答
  • 2020-12-24 11:08

    Can be done with the test iterable, added in twig1.7, as Wouter J stated in the comment :

    {# 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 %}
    

    Reference : iterable

    0 讨论(0)
  • 2020-12-24 11:12

    Ok, I did it with:

    {% if title[0] is not defined %}
        {{ title|trans }}
    {% else %}
        {{ title[0]|trans(title[1]) }}
    {% endif %}
    

    Ugly, but works.

    0 讨论(0)
  • 2020-12-24 11:22

    I found iterable to not be good enough since other objects can also be iterable, and are clearly different than an array.

    Therefore adding a new Twig_SimpleTest to check if an item is_array is much more explicit. You can add this to your app configuration / after twig is bootstrapped.

    $isArray= new Twig_SimpleTest('array', function ($value) {
        return is_array($value);
    });
    $twig->addTest($isArray);
    

    Usage becomes very clean:

    {% if value is array %}
        <!-- handle array -->
    {% else %}
        <!-- handle non-array -->
    {% endif % }
    
    0 讨论(0)
  • 2020-12-24 11:25

    There is no way to check it correctly using code from the box. It's better to create custom TwigExtension and add custom check (or use code from OptionResolver).

    So, as the result, for Twig 3, it will be smth like this

    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;
        }
    }
    
    0 讨论(0)
提交回复
热议问题