Как использовать Twig фильтр "time_diff" на контроллере? - PullRequest
0 голосов
/ 07 января 2019

Я работаю над проектом, использующим версию 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, чтобы сделать расширения доступными на контроллерах?

1 Ответ

0 голосов
/ 07 января 2019

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

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

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

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

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

...