В проекте необходимо реализовать дату в виде “год назад”, “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” для прошлого.