Adicionar um novo filtro aos seus templates Twig utilizando o Symfony2 é uma tarefa bastante simples, que veremos a seguir, com um exemplo que adiciona um novo filtro unserialize – usando a função PHP com o mesmo nome.
Primeiro, vamos criar uma classe para a nossa nova extensão do Twig, que irá conter o nosso filtro. Para facilitar, podemos estender a classe Twig_Extension, ao invés de implementar a interface Twig_ExtensionInterface, pois esta classe já irá definir todos os métodos para nós, então, não precisamos definir todos novamente, mas somente os que nos interessam ( neste exemplo: getFilters() e getName() ).
A extensão poderá ser salva em qualquer local, neste exemplo iremos salvar em \Extension\Twig dentro do bundle TesteBundle (assumindo que este bundle já foi previamente criado).
\\ Acme\TesteBundle\Extension\Twig\UnserializeTwigExtension.php
<?php
namespace Acme\TesteBundle\Extension\Twig;
use Symfony\Component\HttpKernel\KernelInterface;
class UnserializeTwigExtension extends \Twig_Extension
{
public function getFilters()
{
return array(
'unserialize' => new \Twig_Filter_Function('unserialize'),
);
}
public function getName()
{
return 'unserialize_twig_extension';
}
}
O método getName() deverá retornar um identificador único para a nossa extensão.
No arquivo de configuração config.yml (app/config/config.yml) vamos definir um novo serviço para a classe UnserializeTwigExtension:
services:
teste.twig.extension.unserializetwigextension:
class: Acme\TesteBundle\Extension\Twig\UnserializeTwigExtension
tags:
- { name: twig.extension }
Ao aplicarmos a tag para injeção de dependência (DI – Dependency Injection) twig.extension em nosso serviço, estamos informando que nossa classe é uma extensão do Twig personalizada e, também, habilitamos ela.
Pronto! Agora podemos chamar nosso novo filtro unserialize em qualquer template Twig:
# Acme\TesteBundle\Resources\views\Default\index.html.twig
{{ app.session.get('myvar')|unserialize }}
Para mais informações sobre como estender o Twig criando um novo filtro, tag ou função, verifique a documentação em: http://twig.sensiolabs.org/doc/advanced.html
Até mais