Cover of the book Symfony 5: The Fast Track

Symfony 5: The Fast Track is the best book to learn modern Symfony development, from zero to production. +300 pages showcasing Symfony with Docker, APIs, queues & async tasks, Webpack, SPAs, etc.

New in Symfony 4.1: Twig extensions priority

Warning: This post is about an unsupported Symfony version. Some of this information may be out of date. Read the most recent Symfony Docs.

Contributed by
Matt Brunt
in #24777.

Twig supports the overloading of filters, functions, global variables, etc. It's not a commonly needed feature, but it's useful to change the behavior of some extension used in your application.

Overloading those elements require to define them in a new Twig extension and register that extension as late as possible to override the other extensions. When using Twig as a standalone templating engine, it's easy to control the order in which extensions are registered. However, in Symfony you don't have any control of this ordering.

In Symfony 4.1, to allow you to overload any Twig element, we've added support for defining priorities in the Twig extensions. This priority mechanism works the same as in other parts of the framework: priority is defined as a positive or negative integer in the priority attribute of the related service tag (twig.extension in this case):

1
2
3
4
5
6
7
8
# config/services.yaml
services:
    # ...
    App\Twig\AppExtension:
        public: false
        tags:
            # extensions with higher priorities are registered earlier
            - { name: twig.extension, priority: -1024 }

The only caveat is that when defining priorities you cannot rely on service autoconfiguration and must register the Twig extension as a service explicitly to define the priority attribute.

Help the Symfony project!

As with any Open-Source project, contributing code or documentation is the most common way to help, but we also have a wide range of sponsoring opportunities.

Comments

Comments are closed.

To ensure that comments stay relevant, they are closed for old posts.