Проверьте, является ли переменная датой с 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
.