Fui apresentado ao Twig não há muito tempo, mas logo me interessei pela proposta do projeto: simplicidade e flexibilidade ao trabalhar com templates em PHP.
Resumidamente é um projeto criado pelo Fabien Potencier - para quem não o conhece é o criador do symfony framework – e salvo engano há rumores de que ele pretende integrar o Twig à versão 2.x do symfony removendo o PHP super verboso que rola nos templates do symfony desde seu lançamento. * carece fontes concretas
Recursos bacanas e uma sintaxe à lá Django nos templates me chamou muita atenção para não só mais olhar, mas sim, testar para ver melhor a ferramenta.
Não demorou para eu testar como ele se portaria diante de objetos no template e para minha tristeza, para ele ler um atributo, depende nada mais, nada menos do que __get() e __isset(). É possível também, assim como na JSTL ler um atributo iniciado por get. No template você deveria chamá-lo sem esse get. i.e: getFoo() no template seria apenas foo.
Imediatamente, o que vem a mente de quem trabalha com OO ? Quebra brutal de encapsulamento. Sim, __get() por mais fácil que possa parecer, quebra totalmente a segurança de uma variável membro, uma vez que os atributos da mesma tornam-se públicos.
Tentei entrar em contato com o Fabien para ver o motivo que o levou a implementar assim. Ele, bem receptivo - ironia mode on - disse-me: se tiver um patch mande-o, do contrário, peço que seja paciente.
Fiz o patch, revi algumas coisas e mantive compatibilidade com o __get() __isset() que o Twig originalmente aceita e criei um Fork do projeto no GitHub.
Features default
- Suporte a plugins
- Variáveis
- Leitura de arrays por índices int ou string
- Arrays multidimensionais
- Objetos (via __get() __isset() apenas)
- Objetos alinhados (Nested Objects) com __get() __isset() também
- Blocos de controle, loops, etc.
Mudanças
Métodos públicos começados por:
- get
- is
- has
- match
- contain
Podem ser chamados no template sem qualquer problema sem a necessidade dos métodos mágicos.
Abaixo exemplos funcionais:
//...
/**
* SomeVar
* @var string
*/
private $baz;
/**
* Bar Object
* @var Bar
*/
private $bar;
/**
* Magic String with __get
* @var string
*/
public $magic;
public function __construct() {
$this->baz = "Value of Foobar::\$baz";
$this->bar = new Bar();
$this->magic = 'Magic methods still working !';
}
/**
* @return string
*/
public function getBaz() {
return $this->baz;
}
/**
* @return boolean
*/
public function hasBaz() {
return (!empty($this->baz)) ? true : false;
}
private function hasIamNull() {
return false;
}
public function fakehasFoo() {
return 'I will not be displayed !';
}
public function matchesWith($otherString) {
return ('foo' === $otherString);
}
public function getBar() {
return $this->bar;
} // ....
No template teriamos:
<body>
<h1>Meu título</h1>
<p>Bar foo</p>
{% if foo.hasBaz %}
<p>{{ foo.getBaz }}</p>
{% endif %}
{% if foo.hasIamNull %}
<p>{{ foo.getBaz }}</p>
{% endif %}
<p>{{ foo.getAbstractBaz }}</p>
<p>{{ foo.getIamPublic }}</p>
<p>{{ foo.fakehasFoo }}</p>
<p>{{ foo.getBar.getHlegius }}</p>
<p>{{ foo.getBar.getBarFoo.getTwig }}</p>
<p>{{ foo.getBar.getBarFoo.tryToCallMe }}</p> <!-- private function, fails. -->
<p>{{ foo.methodThatIsnotExists }}</p> <!-- without error -->
{% if foo.matchesWith('foo') %}
<p>Yeah, it's matches !</p> <!-- will matches -->
{% endif %}
{% if foo.matchesWith('baz') %}
<p>Yeah, it's matches again :S !</p> <!-- will NOT matches -->
{% endif %}
Métodos não permitidos, índices não existentes e outros tipos de erros são omitidos por default.
Ainda penso em melhorar e implementar mais coisas ao projeto. Minha ideia inicial é ir sempre atualizando do projeto oficial para não distanciar-se muito. O patch eu também encaminhei ao próprio Fabien, mas ainda ele sequer respondeu ao meu e-mail.
Quem já utiliza o Twig e quiser testar essa nova versão mais “Object-oriented friendly” farei questão de dar total suporte e apoio para mantê-la up to date ![]()
Há ainda, exemplos de uso e do que você pode fazer com o Twig que eu modifiquei. Detalhes você encontra no diretório examples do projeto.




Olá Hélio, conheci a pouco tempo o twig, se possível me tirar uma dúvida. É possível atualizar/ler via jquery/ajax somente um bloco(block)?