Проверьте, является ли переменная датой с Twig

У меня есть массив переменных, которые я хочу отобразить в шаблоне Twig, и каждая переменная может быть либо строкой, либо датой.

Если переменная является датой, я хочу применить фильтр date следующим образом:

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

И если это строка, я хочу, чтобы она отображалась обычным способом:

{{ my_var }}

Есть ли способ проверить, является ли переменная датой (т.е. экземпляром объекта PHP DateTime)?

Ответ 1

Возможно, это не лучший способ сделать это, но я нашел решение своей проблемы.

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

Как объект DateTime PHP имеет общедоступный метод getTimestamp, это способ проверить, является ли переменная датой, установлено это свойство или нет.

Ответ 2

Решение 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 %}

Второй случай был тем, с которым я недавно боролся из-за использования объектов ORM ORM. Базовый класс имеет метод __call, который улавливает все тесты Twig is defined.