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

{% raw %}
    {{ global_variable }}
{% endraw %}

Filter

{% raw %}
    {{ 'some sort of text'|filter }}
{% endraw %}

Function

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

If you want more information look here: http://twig.sensiolabs.org/doc/templates.html

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.

<?php
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).

services:
    anywordyouwant.twig.extension.mytwigextension:
        class: Bundle\NameBundle\Extension\MyTwigExtension 
        tags:
            -  { name: twig.extension }

Step 3: Use the filters

Inside your twig templates

{% raw %}
    {{ 'what ever you want'|uppercase_first_letter }}
{% endraw %}