Hoje venho falar de uma das mais usadas linguagens de templates para PHP.
Um dos descuidos mais comuns quando usamos PHP para escrever templates em nossos projetos é definir variáveis e lógicas de processamentos nos templates. Embora esse descuido aconteça constantemente entre desenvolvedores PHP, vale lembrar que no padrão MVC a camada de visão é exclusivamente um arquivo template e os dados deverão exclusivamente ser importados da controller.
O que é Twig?
O Twig é uma linguagem de template open-source, criada e mantida desde 2009 pela SensioLabs(mantenedora do Symfony). Embora seja embarcada por padrão somente no Symfony, ela também poderá ser adicionada no Yii, Laravel, Zend Framework e diversas outras frameworks PHP.
Vantagens e usar o Twig
- Mantém o padrão ideal de templates da camada de visão, eliminando existência de processamentos lógicos que deveriam estar camada de controle;
- Rápido, quando configurado para armazenar cache o Twig torna-se inclusive mais rápido que o próprio PHP;
- Permite o desenvolvedor criar suas próprias tags(normalmente usadas para formatação de dados);
- Mantido ativamente pela SensioLabs com forte contribuição da comunidade PHP;
- Fácil escrita, eliminando encurtando ainda mais o código escrito no template em comparação com o próprio PHP.
Instalando o Twig
Symfony
Por padrão o Symfony já utiliza o Twig como linguagem para escrita de templates. Neste caso não será necessário instalar nada.
Yii 2
No Yii 2 a equipe de desenvolvimento do core criou uma extensão oficial para o Twig. Para instalar você deverá adicionar o pacote yiisoft/yii2-twig utilizando o composer.
Execute o comando abaixo em seu terminal estando no diretório de seu projeto.
$ composer require --prefer-dist yiisoft/yii2-twig
Para utilizar a extensão basta adicionar o código abaixo na configuração da sua aplicação.
return array( //... 'components' => array( 'view' => array( 'renderers' => array( 'twig' => array( 'class' => 'yii\twig\ViewRenderer', // set cachePath to false in order to disable template caching 'cachePath' => '@runtime/Twig/cache', // Array of twig options: 'options' => array( 'auto_reload' => true, ), // ... see ViewRenderer for more options ), ), ), ), );
Zend Framework 2
A equipe da Zend não implementa oficialmente nenhum componente de suporte ao Twig, porem existe um módulo de terceiros muito utilizado para fazer essa implementação, o ZfcTwig. Basicamente, o ZfcTwig adiciona o suporte do Twig no Zend Framework 2 de forma que todos os view helpers estejam disponíveis também quando escrevemos os templates.
Para adicionarmos o ZfcTwig em nosso projeto, acesse o diretório de seu projeto pelo terminal e executar o comando abaixo.
$ composer require zf-commons/zfc-twig
Em seguida, adicione o módulo ZfcTwig em seu arquivo config/application.config.php na key ‘modules’.
Feio isso, o Zend Framework 2 já passa a reconhecer o Twig. Agora vamos fazer mais algumas otimizações para termos um debug intuitivo e tornar a renderização do Twig ainda mais rápido que templates em PHP.
Inicialmente, abra o arquivo config/autoload/local.php de seu projeto e adicione a configuração abaixo. Lembrando que como a configuração já existe, o array do exemplo abaixo deverá ser mesclado com o array da configuração de seu projeto.
return array( //... 'zfctwig' => array( 'environment_options' => array( 'debug' => true, ) ) );
Com a configuração acima, ativamos o modo debug e quando ocorrer erros de template em seu projeto será facilmente identificado pelas exceções geradas pela framework.
Agora vamos configurar o cache para a renderização do template em Twig tornar-se ainda mais rápido que o template em PHP. Para isso, abra o arquivo config/autoload/global.php de seu projeto e adicione a configuração abaixo. Lembrando que assim como no caso acima, seu arquivo de configuração já possuirá um array, o array abaixo deverá ser mesclado com o já existente em suas configurações.
return array( //... 'zfctwig' => array( 'environment_options' => array( 'cache' => __DIR__ . '/../../data/cache/templates', ), ) );
Feito isso, o Zend Framework 2 está preparado e otimizado para trabalharmos com o Twig.
Laravel
Oficialmente o Laravel não suporta o Twig, porém por meio de uma biblioteca de terceiros muito conhecida(o TwigBridge) é possível adicionarmos o suporte na framework. Para instalarmos o TwigBridge, utilizaremos o composer.
Fique atento em relação a versão do Laravel no qual está sendo utilizado em seu projeto e a versão da biblioteca que será instalada. No terminal abra a pasta de seu projeto e digite o comando abaixo de acordo com a versão do Laravel utilizada em seu projeto.
-
Laravel 5 deverá utilizar TwigBridge a partir da versão 0.7;
$ composer require rcrowe/twigbridge 0.8.x
-
Laravel 4.1/4.2 deverá utilizar TwigBridge versão 0.6;
$ composer require rcrowe/twigbridge 0.6.x
-
Laravel 4.0 deverá utilizar TwigBridge versão 0.5.
$ composer require rcrowe/twigbridge 0.5.x
Em seguida, adicione o serviço TwigBridge\ServiceProvider em seu arquivo config/app.php.
Após o serviço habilitado na framework, vamos copiar as configurações da biblioteca para a pasta config. Para isso utilizaremos o Artisan.
$ php artisan vendor:publish --provider="TwigBridge\ServiceProvider"
Template em Twig vs Template em PHP
Para demonstrar a simplicidade do Twig, abaixo vai um exemplo bem simples de um template escrito em PHP e em seguida o mesmo exemplo escrito em Twig.
Template em PHP
<html> <head> <title>Welcome to Symfony!</title> </head> <body> <h1><?php echo $page_title ?></h1> <ul id="navigation"> <?php foreach ($navigation as $item): ?> <li> <a href="<?php echo $item->getHref() ?>"> <?php echo $item->getCaption() ?> </a> </li> <?php endforeach ?> </ul> </body> </html>
Template em Twig
<!DOCTYPE html> <html> <head> <title>Welcome to Symfony!</title> </head> <body> <h1>{{ page_title }}</h1> <ul id="navigation"> {% for item in navigation %} <li><a href="{{ item.href }}">{{ item.caption }}</a></li> {% endfor %} </ul> </body> </html>
Conceitos básicos
Abaixo estão os conceitos básicos principais para começar a escrever seu template em Twig.
Sintaxe | Descrição |
---|---|
{{ … }} | Usado para imprimir uma variável ou o resultado de uma expressão. |
{% … %} | Tag para controlar lógica do template; Usada para executar instruções como por exemplo for-loops. |
{# … #} | Usado para escrever comentários, equivalente ao /* … */ do PHP. O comentário poderá ser escrito em uma única linha ou multiplas linhas. |
O Twig contém filtros que modificam o conteúdo antes de ser renderizado. No exemplo abaixo estarei utilizando um filtro na variável “exemplo” para imprimir todos os caracteres em caixa alta.
{{ exemplo|upper }}
Caso não exista um filtro que atenda sua necessidade, você também poderá criar um filtro customizado. Um exemplo de customização, é o filtro TwigCountry que criei para substituir o código ISO 3166-1 do país para o nome completo do mesmo.
Conclusão
Templates em PHP ficam em desvantagem por permitir que o desenvolvedor acabe desenvolvendo lógicas de controle na camada de visão, o que na maioria das vezes acabam tornando o projeto inseguro.
Levando em consideração a quantidade de código escrito para desenvolver um template em Twig e um template em PHP, o Twig tem uma vantagem bem superior em relação a facilidade de escrita e consequentemente na minha opinião o desenvolvedor acaba tendo um entendimento mais rápido do que foi escrito.
Em breve estarei postando outros guias em que estarei me aprofundando mais em algumas características do Twig. 🙂
Links úteis
- Documentação oficial do Twig(em inglês)
- GitHub do Yii2 Twig, extensão oficial do Twig para o Yii 2(em inglês)
- GitHub do ZfcTwig, biblioteca de terceiros para o Zend Framework 2(em inglês)
- GitHub do TwigBridge, biblioteca de terceiros para o Laravel(em inglês)
- Documentação do Symfony para criação de templates(em inglês)