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

Если вы хотите создать в Twig пользовательские функции, фильтры, тесты или ещё что-либо, вам понадобится создать расширение Twig. Вы можете прочитать больше о `Расширениях Twig`_ в документации Twig.

Создайте класс расширения

Представьте, что вы хотите создать новый фильтр под названием price, который форматирует число в денежное значение:

1
2
3
4
{{ product.price|price }}

{# передайте в 3 необязательных аргументах #}
{{ product.price|price(2, ',', '.') }}

Создайте класс, расширяющий \Twig_Extension, и заполните логику:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
// src/AppBundle/Twig/AppExtension.php
namespace AppBundle\Twig;

class AppExtension extends \Twig_Extension
{
    public function getFilters()
    {
        return array(
            new \Twig_SimpleFilter('price', array($this, 'priceFilter')),
        );
    }

    public function priceFilter($number, $decimals = 0, $decPoint = '.', $thousandsSep = ',')
    {
        $price = number_format($number, $decimals, $decPoint, $thousandsSep);
        $price = '$'.$price;

        return $price;
    }
}

Note

До версии Twig 1.26, ваше расширение должно было определять дополнительный метод getName(), который возвращал внутреннее имя расширения (например, app.my_extension). Когда ваше расширение должно быть совместимо с версиями Twig до 1.26, включите этот метод, который опускается в примере выше.

Tip

Кроме пользовательских фильтров, вы также можете добавлять пользовательские функции и регистрировать глобальные переменные.

Регистрация расширения в качестве сервиса

Далее, зарегистрируйте ваш класс в качестве сервисаи тегируйте его twig.extension. Если вы используете конфигурацию services.yml по умолчанию, то вы закончили! Symfony автоматически узнает о вашем новом сервисеи добавит тег.

Теперь вы можете начать использовать ваш фильтр в любом шаблоне Twig.

Эта документация является переводом официальной документации Symfony и предоставляется по свободной лицензии CC BY-SA 3.0.