Как использовать Twig filter time_diff на контроллере?

Я работаю над проектом, используя версию Symfony 3.0, и я добавил место, где пользователи могут видеть, сколько времени назад был добавлен элемент. Чтобы иметь возможность использовать это, я добавил расширение даты в файл services.yml следующим образом:

twig.extension.date:
       class: Twig_Extensions_Extension_Date
       tags:
            - { name: twig.extension }

Теперь я могу использовать следующий код: {{ answer.answeredAt|time_diff }} и все правильно, потому что он показывает, например, «2 часа назад».

Моя проблема в том, что некоторые из этих «ответов» могут быть добавлены вызовом javascript. Я немного поискал, и лучшим вариантом было отобразить этот бит ветки в контроллере в виде строки и отправить его обратно в ответе javascript. Сюда:

$now = new \DateTime();
$template = $this->get('twig')->createTemplate('{{ answeredAt|time_diff }}');
$date = $template->render(['answeredAt' => $now]);

$response = new JsonResponse([
    'answer' => [
        'id' => $answer->getId(),
        'text' => $answer->getText(),
        'date' => $date
    ]
]);

Я думал, что это должно работать нормально, но это не так. Хотя ошибки не было, поле даты всегда возвращается пустым. Нужно ли мне делать что-то особенное в services.yml, чтобы сделать расширения доступными на контроллерах?


person rafaelmorais    schedule 07.01.2019    source источник
comment
Хотя я бы выбрал этот подход 'date' => $this->get('twig')->getExtension('date')->diff(new \DateTime())   -  person DarkBee    schedule 07.01.2019
comment
@DarkBee таким образом, верните эту ошибку Ошибка типа: аргумент 1, переданный в Twig_Extensions_Extension_Date::diff(), должен быть экземпляром Twig_Environment, экземпляром DateTime.   -  person rafaelmorais    schedule 07.01.2019
comment
->diff($this->get('twig'), new \DateTime()); - извините   -  person DarkBee    schedule 07.01.2019
comment
Таким образом, ошибка не возвращается, но я получил тот же пустой ответ, что и мой подход.   -  person rafaelmorais    schedule 07.01.2019
comment
Какой результат вы ожидаете? Читая исходный код, кажется, что если разница равна 0, он действительно вернет '', как показано здесь здесь   -  person DarkBee    schedule 07.01.2019
comment
Вы абсолютно правы, это была проблема. Разница всегда была 0, я добавил ->modify('-1 second') и все работало нормально, даже с моим подходом. Спасибо за помощь.   -  person rafaelmorais    schedule 07.01.2019
comment
почему бы не создать функцию в объекте, а затем вызвать ее? $now = new \DateTime(); $diff = date_diff($now, $this>-$this->createdAt); $days = $diff->format("%a"); return $days;   -  person hous    schedule 07.01.2019


Ответы (1)


Проблема связана с тем, что когда разница дат не существует, другими словами, когда обе даты совпадают, функции возвращают пустое значение, и это вводило меня в заблуждение, заставляя думать, что что-то не так.

Если вы проверите мой код, я искал разницу между сейчас и new \DateTime(), что тоже сейчас, так что никакой разницы.

Если вы все же хотите что-то показать пользователю, как в моем случае, вы можете использовать следующий код:

$date = $template->render(['answeredAt' => $now->modify('-1 second')]);

Это покажет пользователям: «1 секунду назад».

person rafaelmorais    schedule 07.01.2019