2012-12-14 93 views
32

是否可以檢查給定變量是否爲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 %} 

是否有可能做這種方式?或者也許你有更好的解決方案?

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

醜陋,但是作品:

+2

你也許可以做一些與'iterable'測試? http://twig.sensiolabs.org/doc/tests/iterable.html –

回答

86

可與測試iterable來完成,在twig1.7增加,如沃特法官在評論中指出:

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

注意:其他對象也可以是「可迭代的」,即使它們不是一個'數組'。如果某物是數組,則Iterable不是真正的測試。我有一個答案如何進行一個數組測試,如下面的「{%if value is array%}」。 http://stackoverflow.com/a/29642662/417822 –

9

好吧,我做到了。

+7

如果數組在'[0]'處沒有任何內容,則不起作用 –

7

我發現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 % } 
+0

在這裏的一個旁註:這個測試將返回false爲每個自定義對象實現ArrayAcces,Traverseable,... – DarkBee

+0

正確,但核心問題是,並非所有的'iterable'項目是平等的。根據類型,「迭代」的結構可能會有所不同。 –

+0

這個類文件應該放在Symfony2中? – Aerendir

相關問題