14

我有一个要在 Twig 模板中显示的变量数组,每个变量可以是字符串或日期。

如果变量是日期,我想像这样应用date过滤器:

{{ my_var|date('d/m/Y') }}

如果它是一个字符串,我希望它以通常的方式显示它:

{{ my_var }}

有什么方法可以测试变量是否是日期(即 PHP DateTime 对象的实例)?

4

3 回答 3

36

也许不是最好的方法,但我找到了解决问题的方法。

{% if my_var.timestamp is defined %}
    {{ my_var|date('m/d/Y') }}
{% else %}
    {{ my_var }}
{% endif %}

由于DateTimePHP 对象具有公共getTimestamp方法,因此可以检查变量是否为日期,无论此属性是否设置。

于 2013-01-23T14:42:45.327 回答
7

Michael 的解决方案在大多数情况下都有效,但是当您想要一个通用解决方案时,您应该考虑一些特殊情况。

首先,您测试的具有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 对象而苦苦挣扎的情况。基类具有__call捕获所有 Twigis defined测试的方法。

于 2014-02-21T17:51:37.363 回答
2

您可以添加一个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 %}
于 2018-06-06T13:39:25.023 回答