我正在构建一个显示用户数据的Twig页面;数据来自用户和配置文件实体(您可以从用户访问)。
为了避免页面在变量为null时显示错误,我必须检查是否定义了每个变量(这使代码更加重,如你所见)。
<dt>firstname:</dt>
{% if user.firstname is defined %}
<dd>{{ user.firstname|title }}</dd>
{% endif %}
<dt>lastname:</dt>
{% if user.lastname is defined %}
<dd>{{ user.lastname|title }}</dd>
{% endif %}
<dt>Email address:</dt>
{% if user.lastname is defined %}
<dd>{{ user.email|title }}</dd>
{% endif %}
<dt>Birthday:</dt>
{% if user.profile.birthday is defined %}
<dd>{{ user.profile.birthday|date("d M y") }}</dd>
{% endif %}
<dt>Mobile phone:</dt>
{% if user.profile.mobilePhone is defined %}
<dd>{{ user.profile.mobilePhone }}</dd>
{% endif %}
<dt>Landline:</dt>
{% if user.profile.landline is defined %}
<dd>{{ user.profile.landline }}</dd>
{% endif %}
<dt>Website:</dt>
{% if user.profile.website is defined %}
<dd>{{ user.profile.website }}</dd>
{% endif %}
有没有办法避免这样做?在显示之前检查变量是否定义的更好更短的方法是什么?
答案 0 :(得分:4)
不知道这是否符合您的需求,但您可以这样做:
<dd>{{ user.profile.landline|default("") }}</dd>
对于过滤后的数据,方法类似:
<dd>{{ user.firstname|default("")|title }}</dd>
现在问题就出现了。我假设,您不希望将其默认为today
或其他任何其他内容。
@Francesco 也发布了非常简单的解决方案,因此根据您真正想要实现的目标可能会更好(例如,只有在定义数据时打印<dd>
,日期属性,等...)。
希望这有帮助
答案 1 :(得分:1)
直接回答你的问题:不,除了使用三元运算符外,AFAIK没有捷径:
{{ user.profile.landline is defined ? user.profile.landline : "" }}
甚至更短的语法
{{ user.profile.landline is defined ? user.profile.landline }}
但是我要说这些检查应该在控制器中进行,以便始终定义Twig中的变量。你在Twig模板中的条件越少越好。
答案 2 :(得分:0)
您还可以更改树枝的配置:
如果变量或属性不存在,当strict_variables选项设置为false时,您将收到一个空值;或者,如果设置了strict_variables,Twig将抛出错误(请参阅环境选项)。 Source
在config.yml的正确部分添加以下行:
twig:
strict_variables: false
Here你得到了更多信息。
编辑:
正如@Jovan Perovic在评论部分已经提到的那样,这个解决方案有点冒险。设置strict_variables: false
之后,即使您在变量名称中输入了一个简单的拼写错误,Twig也不会抛出有关您使用的变量的任何异常。这可以使您的代码验证更加复杂。