La principal motivación para escribir una extensión es mover el código usado frecuentemente a una clase reutilizable como agregar apoyo para la internacionalización. Una extensión puede definir etiquetas, filtros, pruebas, operadores, variables globales, funciones y visitantes de nodo.
La creación de una extensión también hace una mejor separación del código que se ejecuta en tiempo de compilación y el código necesario en tiempo de ejecución. Por lo tanto, hace que tu código sea más rápido.

En este post te explicare paso a paso como Crear extensiones personalizadas en twig.

Creando la clase de la extensión

Para obtener la funcionalidad personalizada primero debes crear la clase para la extensión Twig. Como ejemplo vas a crear un filtro para dar formato a un precio suministrando un número en el precio:

// src/Acme/DemoBundle/Twig/AcmeExtension.php
namespace Acme\DemoBundle\Twig;

class AcmeExtension 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;
	}

	public function getName()
	{
		return 'acme_extension';
	}
}

Registrando una extensión como servicio

Ahora hay que dejar que el contenedor de servicios sepa de su nueva extensión declarando la misma:

YAML:

# src/Acme/DemoBundle/Resources/config/services.yml
services:
acme.twig.acme_extension:
class: Acme\DemoBundle\Twig\AcmeExtension
tags:
- { name: twig.extension }

XML:

<!-- src/Acme/DemoBundle/Resources/config/services.xml -->
<services>
<service id="acme.twig.acme_extension" class="Acme\DemoBundle\Twig\AcmeExtension">
<tag name="twig.extension" />
</service>
</services>

PHP:

// src/Acme/DemoBundle/Resources/config/services.php
use Symfony\Component\DependencyInjection\Definition;

$container
->register('acme.twig.acme_extension', '\Acme\DemoBundle\Twig\AcmeExtension')
->addTag('twig.extension');

Usando la extensión personalizada

Usar tu recién creada extensión de Twig no es diferente a cualquier otra:

{# produce $5,500.00 #}
{{ '5500'|price }}

Pasando otros argumentos a tu filtro:

{# outputs $5500,2516 #}
{{ '5500.25155'|price(4, ',', '') }}

Notas

Ten en cuenta que las extensiones Twig no se cargan de manera diferida. Esto significa que hay una mayor probabilidad de que obtengas una CircularReferenceException o ScopeWideningInjectionException si cualquier servicio (o tu extensión Twig —en este caso—) es dependiente del servicio Petición. Para obtener más información, échale un vistazo a Cómo Trabajar con Ámbitos