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