В Twig имеется множество расширений, которые удобно использовать в шаблонах. Однако может возникнуть ситуация, когда будет необходимо написать собственное расширение. Например мы хотим отображать даты в формате: 2 дня назад, 3 месяца назад и т.п.
Пусть это расширение используется следующим образом:
{{ comment.created|created_ago }}
1. Сперва создадим файл для Twig расширения по адресу src/Acme/TestBundle/Twig/Extensions/AcmeTestExtension.php со следующим содержимым:
<?php // src/Acme/TestBundle/Twig/Extensions/AcmeTestExtension.php namespace Acme\TestBundle\Twig\Extensions; class AcmeTestExtension extends \Twig_Extension { public function getFilters() { return array( 'created_ago' => new \Twig_Filter_Method($this, 'createdAgo'), ); } public function createdAgo(\DateTime $dateTime) { $delta = time() - $dateTime->getTimestamp(); if ($delta < 0) throw new \InvalidArgumentException("createdAgo is unable to handle dates in the future"); $duration = ""; if ($delta < 60) { // Seconds $time = $delta; $duration = $time . " second" . (($time > 1) ? "s" : "") . " ago"; } else if ($delta <= 3600) { // Mins $time = floor($delta / 60); $duration = $time . " minute" . (($time > 1) ? "s" : "") . " ago"; } else if ($delta <= 86400) { // Hours $time = floor($delta / 3600); $duration = $time . " hour" . (($time > 1) ? "s" : "") . " ago"; } else { // Days $time = floor($delta / 86400); $duration = $time . " day" . (($time > 1) ? "s" : "") . " ago"; } return $duration; } public function getName() { return 'acme_test_extension'; } }
Создание расширения осуществляется очень просто. Мы изменим метод getFilters() так, чтобы можно было возвращать любое количество филтров, которые нам нужны. В данном случае мы создаем фильтр created_ago. Далее этот фильтр мы регистрируем для использования в методе createdAgo, который будет просто трансформировать формат даты DateTime объекта в строку, представляющую продолжительность времени, прошедшего с тех пор, как было сохранено первоначальное значение объекта DateTime object.
2. Далее зарегистрируем наше новое расширение в файле конфигурации - src/Acme/TestBundke/Resources/config/services.yml следующим образом:
services: blogger_blog.twig.extension: class: Blogger\BlogBundle\Twig\Extensions\BloggerBlogExtension tags: - { name: twig.extension }
3. Теперь новый фильтр готов к использованию! Есть ряд полезных расширений Twig доступных в библиотеке от GitHub - Twig-Расширения.