我想要在Twig模板中显示一系列变量,每个变量可以是字符串或日期。
如果变量是日期,我想像这样应用date
过滤器:
{{ my_var|date('d/m/Y') }}
如果它是一个字符串,我希望它以通常的方式显示它:
{{ my_var }}
有没有办法测试变量是否是日期(即PHP DateTime对象的实例)?
答案 0 :(得分:25)
也许不是最好的方法,但我找到了解决问题的方法。
{% if my_var.timestamp is defined %}
{{ my_var|date('m/d/Y') }}
{% else %}
{{ my_var }}
{% endif %}
由于DateTime
PHP对象具有公共getTimestamp
方法,因此可以检查变量是否为此属性设置的日期。
答案 1 :(得分:5)
迈克尔的解决方案适用于大多数情况,但是当您想要通用解决方案时,您应该考虑一些特殊情况。
首先,您测试具有getTimestamp()
方法的对象不必是DateTime
实例。当时间戳字段在对象中有用时,我会遇到很多情况,所以我会测试getTimezone()
方法。
其次,如果my_var
是一个定义了魔术__call
方法的对象,那么所有这些测试都会变为正数。这就是我建议进行以下负面测试的原因:
{% if my_var.timezone is defined and my_var.nonExistingProperty is not defined %}
{{ my_var|date('m/d/Y') }}
{% else %}
{{ my_var }}
{% endif %}
第二个案例是我最近因为使用Propel ORM对象而遇到的问题。基类具有捕获所有Twig __call
测试的is defined
方法。
答案 2 :(得分:0)
您可以添加class(my_var)
功能,例如:
// src/AppBundle/Twig/HelperExtension.php
namespace AppBundle\Twig;
use Twig_Extension;
use Twig_SimpleFunction;
class HelperExtension extends Twig_Extension
{
public function getFunctions()
{
return array(
new Twig_SimpleFunction('class', array($this, 'getClassName')),
);
}
public function getClassName($object)
{
if (!is_object($object)) {
return null;
}
return get_class($object);
}
}
用法:
{% if class(my_var) == 'DateTime' %}
...
{% endif %}