В проекте необходимо реализовать дату в виде “год назад”, “10 минут назад” и тп. Для этого есть много решений, но мы воспользуемся TwigExtensions.
Установка расширения
composer require twig/extensions
добавляем расширение в Twig src/AppBundle/Resources/config/twig_extensions.xml
,
<?xml version="1.0" ?> <container xmlns="http://symfony.com/schema/dic/services" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd"> <parameters> <parameter key="f_devs_article.twig.timeago.extension.class">Twig_Extensions_Extension_Date</parameter> </parameters> <services> <service id="f_devs_article.twig.timeago.extension" class="%f_devs_article.twig.timeago.extension.class%" public="false"> <argument type="service" id="translator"/> <tag name="twig.extension"/> </service> </services> </container>
и не забудем подключить файл
в нашем бандле src/AppBundle/DependencyInjection/AppExtension.php
<?php namespace AppBundle\DependencyInjection; //…. class AppExtension extends Extension { /** * {@inheritDoc} */ public function load(array $configs, ContainerBuilder $container) { //... $loader->load('twig_extensions.xml'); } }
или в файл /app/config/config.yml
imports: - { resource: @AppBundle/Resources/config/twig_extensions.xml }
Добавим переводы
Для русского src/AppBundle/Resources/translations/date.ru.yml
diff: ago: second: "несколько секунд назад" minute: "{1} минуту назад |]1,5[ %count% минуты назад |]4,Inf[ %count% минут назад" hour: "{1} час назад |]1,5[ %count% часа назад |]4,Inf[ %count% часов назад" day: "{1} день назад |]1,5[ %count% дня назад |]4,Inf[ %count% дней назад" month: "{1} месяц назад |]1,5[ %count% месяца назад |]4,Inf[ %count% месяцев назад" year: "{1} год назад |]1,5[ %count% года назад |]4,Inf[ %count% лет назад" in: second: "через несколько секунд" minute: "{1} через минуту |]1,5[ через %count% минуты |]4,Inf[ через %count% минут" hour: "{1} через час |]1,5[ через %count% часа |]4,Inf[ через %count% часов" day: "{1} через день |]1,5[ через %count% дня |]4,Inf[ через %count% дней" month: "{1} через месяц |]1,5[ через %count% месяца |]4,Inf[ через %count% месяцев" year: "{1} через год |]1,5[ через %count% года |]1,4[ через %count% лет"
Для английского src/AppBundle/Resources/translations/date.en.yml
diff: ago: second: "a few seconds ago" minute: "{1} a minute ago |]1,Inf[ %count% minutes ago" hour: "{1} a hour ago |]1,Inf[ %count% hours ago" day: "{1} a day ago |]1,Inf[ %count% days ago" month: "{1} a month ago |]1,Inf[ %count% months ago" year: "{1} a year ago |]1,Inf[ %count% years ago" in: second: "{1} in a second |]1,Inf[ in a few seconds" minute: "{1} in a minute|]1,Inf[ in %count% minutes" hour: "{1} in a hour |]1,Inf[ in %count% hours" day: "{1} in a day |]1,Inf[ in %count% days" month: "{1} in a month |]1,Inf[ in %count% months" year: "{1} in a year |]1,Inf[ in %count% years"
Для других языков добавляем по аналогии.
Используем в наших шаблонах
<time>{{ article.updatedAt|time_diff }}</time>
Заключение
Для отображение даты нам надо только подключить и настроить расширение, не надо использовать или писать свое расширение. Так же нам будут доступны даты не только вида “5 минут назад” но и в будущем “через 10 часов”. Если не использовать “translator” тогда дата будет вида “in 1 minute” или “in 5 minutes” для будущего или “10 minutes ago”, “1 hour ago” для прошлого.