How to make a Symfony2 Twig Extension

I couldn’t find a decent tutorial online that explained twig extensions in a simple way so for those of you in need here is a step by step guide on how to create a twig extension for Symfony2.

The first thing to know is the difference between twig global, filter and functions (or just how the look in twig templates).


{{ global_variable }}


{{ 'some sort of text'|filter }}


{% function('some variable or text') %}

If you want more information look here:

For the following steps remember to change the ‘Bundle’ and ‘NameBundle’ to your bundles values. Also note that the following code is just for creating filters.

Step 1: Create the filter

Create a file Bundle/NameBundle/Extension/MyTwigExtension.php and use the following code inside it.

namespace Bundle\NameBundle\Extension;
use Symfony\Component\HttpKernel\KernelInterface;
class MyTwigExtension extends \Twig_Extension
    public function getFilters()
        return array(
            'uppercase_first_letter' => new \Twig_Filter_Method($this, 'uppercase_first_letter'),
            'var_dump' => new \Twig_Filter_Function('var_dump')

    function uppercase_first_letter($var){
        return ucwords($var);

    public function getName()
        return 'recensus_twig_extension';

So I’ve created two filters that I can use in my twig templates, uppercase_first_letter and var_dump. var_dump is already a function within php so that just works without having to create the method within the MyTwigExtension class. uppercase_first_letter require me to create a public method within the class.

Notice the different classes used, Twig_Filter_Method for a custom methods and Twig_Filter_Function for a php method.

Step 2: Register with config

Then you need to add the following code to the bottom of the config file (/app/config/config.yml).

        class: Bundle\NameBundle\Extension\MyTwigExtension 
            -  { name: twig.extension }

Step 3: Use the filters

Inside your twig templates

{{ 'what ever you want'|uppercase_first_letter }}