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 😉