Symfony 2 Twig |date() не работает?

у меня есть небольшая проблема, и я действительно не знаю, почему. Я печатаю переменную datetime в twig с помощью |date(), но она всегда печатает фактическое время.

для отладки я помещаю в свой шаблон следующий код:

<pre>
{% debug entity.getCreatedAt|date("d.m.Y H:i:s") %}
{% debug entity.getCreatedAt|raw %}
{% debug entity.CreatedAt|raw %}
{% debug entity.CreatedAt|date("d.m.Y H:i:s") %}

My Variable is called CreatedAt so normally I should get the correct output with entity.CreatedAt|date("d.m.Y H:i:s"), right?

Мой вывод отладки выглядит следующим образом:

string '16.01.2013 13:46:03' (length=19) //entity.getCreatedAt|date("d.m.Y H:i:s")

object(DateTime)[4611] //entity.getCreatedAt|raw
 public 'date' => string '2013-01-16 13:46:03' (length=19)
 public 'timezone_type' => int 3
 public 'timezone' => string 'Europe/Berlin' (length=13)

object(DateTime)[4938] //entity.CreatedAt|raw
 public 'date' => string '2013-02-20 21:46:53' (length=19)
 public 'timezone_type' => int 3
 public 'timezone' => string 'Europe/Berlin' (length=13)

string '20.02.2013 21:46:53' (length=19) //entity.CreatedAt|date("d.m.Y H:i:s")

Я не понимаю, почему это NULL, как только я вызываю CreatedAt. И ВНЕ от тега отладки это ВСЕГДА NULL, независимо от написания.

В моей сущности у меня есть:

private $CreatedAt;

public function setCreatedAt($createdAt)
{
    $this->CreatedAt = $createdAt;

    return $this;
}

public function getCreatedAt()
{
    return $this->CreatedAt;
}

И в YML у меня есть:

CreatedAt:
  type: datetime
  nullable: true

Кто-нибудь видит ошибку?? Я действительно не могу найти его, может быть, это ошибка?

Спасибо


person Tny    schedule 20.02.2013    source источник
comment
У вас есть тот же результат, используя {{ entity.CreatedAt|date("d.m.Y H:i:s") }}?   -  person cheesemacfly    schedule 21.02.2013
comment
Я протестировал и действительно не могу воспроизвести... Вы получаете тот же результат, используя dump вместо `{% отладки %}?   -  person cheesemacfly    schedule 22.02.2013
comment
Привет Cheesemacfly, я решил свою проблему сегодня - и это была действительно глупая ошибка! У меня был класс prePersist с именем CreatedAt(), и Twig, конечно же, вызывал его и получал NULL.. поэтому я переименовал свой класс prePersist в prePersist(), и теперь он работает отлично!   -  person Tny    schedule 28.02.2013


Ответы (2)


Если вы хотите получить доступ к своей частной переменной $CreatedAt за пределами вашего класса сущности, вы должны вызвать общедоступный метод получения getCreatedAt() (для этого он и существует).

И в вашем шаблоне ветки, когда вы вызываете {% debug entity.CreatedAt|date("d.m.Y H:i:s") %}, поскольку entity.CreatedAt равно NULL, возвращаемая строка основана на новом объекте даты:

Если значение, переданное фильтру даты, равно нулю, по умолчанию будет возвращена текущая дата.

http://twig.sensiolabs.org/doc/filters/date.html

ОБНОВЛЕНИЕ:

Как упомянул @insertusernamehere, twig автоматически вызывает общедоступный геттер.
Но такое поведение, по-видимому, происходит только при использовании разделителей {{ }} вместо {% %}.

http://twig.sensiolabs.org/doc/templates.html#synopsis

person cheesemacfly    schedule 20.02.2013
comment
На самом деле Twig вызовет для вас метод получения. - person insertusernamehere; 21.02.2013
comment
Спасибо за ваш ответ, я также пробовал это с public $createdAt, но это не меняет этого поведения. И самое интересное, что я думаю, это то, что в {% debug entity.getcreatedat|date(dmY H:i:s) %} я получаю правильный результат, но без отладки я получаю NULL... это то, что я действительно не Т понять - person Tny; 21.02.2013
comment
@insertusernamehere Сначала я согласился с вами, но вы уверены, что это тот случай, когда доступ к объекту осуществляется между {% %} вместо {{ }}? - person cheesemacfly; 21.02.2013
comment
Кажется, ты был прав. Добавил public в CreatedAt и распечатал его с entity.CreatedAt|date(d.m.Y H:i:s), и теперь он работает. Но, например, я также получил строку private $PersonGender; а этот тоже печатает в приватном режиме, только с нужной мне датой и временем общедоступной. Может быть, это потому, что ему нужно выполнить некоторую работу -›format() над общедоступным методом? - person Tny; 21.02.2013
comment
Если вы используете {{ entity.CreatedAt|date("d.m.Y H:i:s") }}, разве вы не получите ожидаемого результата? - person cheesemacfly; 21.02.2013
comment
Да, но только до тех пор, пока это общедоступно. Все остальные используемые переменные по-прежнему являются частными и работают, они необходимы только для изменения всех переменных DateTime. - person Tny; 21.02.2013
comment
Это действительно странно, потому что, как сказал @insertusernamehere, Twig вызывает для вас геттер... - person cheesemacfly; 21.02.2013
comment
Так может это действительно баг? - person Tny; 21.02.2013
comment
Извините, ребята, меня не было несколько минут - какой вывод? - person insertusernamehere; 21.02.2013
comment
Если я сделаю CreatedAt общедоступным и вызову {{ entity.CreatedAt|date(d.m.Y H:i:s) }}, он работает, немного странно, я думаю, но хорошо :-) - person Tny; 21.02.2013
comment
@insertusernamehere я пришел к выводу, что вы были правы, но это имеет место только при использовании {{ }}, а не {% %}, но я ничего не могу найти в документации по этому поводу... - person cheesemacfly; 21.02.2013
comment
Я обновил свой ответ, но позже я проведу несколько тестов, чтобы подтвердить, что это правда! Но все равно странно :) - person cheesemacfly; 21.02.2013
comment
Но @cheesemacfly я использовал только теги {% %} для демонстрации, теперь я использую {{ }} и все еще нуждаюсь в общедоступности - person Tny; 21.02.2013
comment
@Tny определенно странно ... Я проведу несколько тестов позже (возможно, завтра) и посмотрю, смогу ли я воспроизвести. - person cheesemacfly; 21.02.2013

В PHP функции-члены нечувствительны к регистру, а члены класса чувствительны к регистру. Таким образом, getCreatedAt будет работать так же хорошо, как getcreatedat, но CreatedAt отличается от createdat.

Вот дополнительная информация об этом: Почему функции и методы в PHP нечувствительны к регистру?.

person insertusernamehere    schedule 20.02.2013
comment
Привет, вставьте имя пользователя здесь, да, я знаю о чувствительном к регистру, просто сделал это, чтобы показать мою ошибку. Пожалуйста, взгляните на пример выше, я обновлю его через секунду. - person Tny; 21.02.2013