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>
0sem comentários ainda