66

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

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

4

5 回答 5

142

可以通过iterable在 twig1.7 中添加的测试来完成,正如 Wouter J 在评论中所说:

{# evaluates to true if the users variable is iterable #}
{% if users is iterable %}
    {% for user in users %}
        Hello {{ user }}!
    {% endfor %}
{% else %}
    {# users is probably a string #}
    Hello {{ users }}!
{% endif %}

参考:可迭代

于 2013-07-30T09:04:49.080 回答
13

好的,我做到了:

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

丑陋,但有效。

于 2012-12-14T09:48:21.890 回答
12

我发现iterable它不够好,因为其他对象也可以迭代,并且明显不同于array.

因此添加一个新Twig_SimpleTest的来检查一个项目is_array是否更加明确。您可以将其添加到您的应用程序配置/在引导树枝之后。

$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 % }
于 2015-04-15T06:05:53.597 回答
3

无法使用框中的代码正确检查它。最好创建自定义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;
    }
}
于 2020-01-20T20:24:28.900 回答
-1

假设您知道一个值始终是字符串或数组的事实:

{% if value is iterable and value is not string %}
    ...
{% else %}
    ...
{% endif %}

在我正在从事的项目中,这对我来说已经足够好了。我意识到您可能需要另一种解决方案。

于 2021-07-28T20:11:48.293 回答