Seções iMasters
PHP

Por que eu uso Smarty: o PHP é uma linguagem feia de templates

Houve um debate aqui sobre a utilidade do Smarty como uma ferramenta de desenvolvimento.
Foi desencadeada (mais uma vez) pelo lançamento (ou pelo menos pela nova percepção)
do nosmarty.net. Eu comentei:

Não entendo como ZF ou
Symfony ou qualquer framework possa ser uma “alternativa” para o Smarty. Smarty
não é um framework – é simplesmente um mecanismo de template. Ele não deveria
ser usado para outra coisa a não ser para o componente da camada de visualização da
sua aplicação MVC. Como qualquer outro software, ele tem uma curva de
aprendizado e uma certa quantidade de peculiaridades. Usar o Smarty não garante
um bom design – isso ainda precisa ser gerenciado por programadores que tenham
mais experiência do que escrever um programa “Hello, world!” e ler um
tutorial. Acredito que esse fato tem estado por aí desde
2011, e ainda é usado como uma prova para sua utilidade dentro da
comunidade. Se o Smarty for utilizado da maneira correta, não vejo por que ele
não possa ter seu lugar dentro do arsenal de ferramentas que os desenvolvedores
utilizam.

Ele foi combatido por Paul M.
Jones
com:

Na minha opinião, não
existe uma maneira correta de utilizar o Smarty. Ele é a solução para um
problema mal indicado. Penso que deveríamos ter que elaborar mais sobre isso em
outro post, mais longo. Ah, mas eu já fiz isso! http://paul-m-jones.com/?p=273

Eu compreendo esse argumento, no entanto,
eu ainda tenho uma razão para usar o Smarty: o PHP é uma linguagem feia de
templates. Eu usei o Smarty e o Symfony (o qual conta com a sintaxe
alternativa
do PHP
para templates) e ainda prefiro o Smarty.

Os exemplos no nosmarty.net geralmente
mostram uma instância de ecoar uma variável. Nesse caso, é claro, eu consigo
ver – por que usar um sistema de templates pesado que demora mais para analisar
e pode ser terrível para configurar e administrar. No entanto, se você estiver
olhando para uma porção da página html que tem que dar saída par variáveis
múltiplas, o Smarty é bem mais simples.

     SMARTY:
<td>Name</td><td>{$name}</td>
<td>Email</td><td>{$email}</td>
<td>Phone</td><td>{$phone}</td>

PHP:
<td>Name</td><td><?php echo $name; ?></td>
<td>Email</td><td><?php echo $email; ?></td>
<td>Phone</td><td><?php echo $phone; ?></td>

Quando você começa a repetir <?php …
?> em todo lugar, ele fica bastante redundante e, francamente, feio.

Talvez o meu uso do Smarty seja um pouco
egoísta, mas, no final das contas, o estilo de programação e o conforto dependem
da preferência pessoal. A maioria, não todas, das ferramentas de programação
tem a habilidade de serem mal utilizadas. Eu ainda considero o Smarty uma
ferramenta útil no meu arsenal de programação. Apesar de eu não ter usado o
Smarty há mais de 2 anos, usando somente templates PHP (principalmente devido
às convenções de templates da Symfony), eu iria usá-lo novamente alegremente
para ganhar novamente templates legíveis. 

?

Texto original disponível em http://www.dotevan.com/2009/02/05/why-i-use-smarty-php-is-an-ugly-templating-language/

Mensagem do anunciante:

Em apoio à evangelização do WordPress, os cursos da Apiki são gratuitos para que você possa se especializar na plataforma que mais cresce no mundo. Vagas limitadas, Inscreva-se agora.

Comente também

21 Comentários

Igor Carvalho de Paula

Não é “por Evan Fribourg”, já que o texto é original de outra pessoa ou site.

    Rina Noronha

    Olá Igor,
    o texto é de autoria do Evan Fribourg, traduzido por nós com autorização do autor. O link para o artigo original, no site do próprio Evan, está ao final do texto.

William Ap. Brandino

Uso o Smarty desde o início do ano, salva minha vida !! Acho que cada um escolhe a ferramenta que bem entender, desde que se sinta feliz e veja que o teu projeto não esteja se prejudicando.
Eu recomendo Smarty !!

Victor Gomes

Não é necessário Smarty para fazer isso. Procure se informar sobre a string literal do PHP, onde podemos utilizar seu exemplo da mesma forma, exemplo:

<?php
echo <<<CHAVE
Name{$name}
Email{$email}
Phone{$phone}
CHAVE;
?>

Abraços,
Victor Gomes – ZCE PHP5

    Nícholas André

    O Smarty não é só isso… E esse seu método não provê uma correta separação entre a lógica e as views.

    Victor Gomes

    Não é um método, é uma string heredoc. Provando para você que o PHP também não é só isso que o artigo mostra.
    Separar a lógica das views pode ser muito bem feito somente com o PHP, adotando o design pattern MVC, não precisa necessariamente de um framework de View para isso e muito menos de um artigo publicado a mais de 2 anos atrás.
    Qualidade iMasters, precisa de mais qualidade!

    Evaldo de Jesus Lindoso Barbosa

    Bom, uso Smarty há alguns anos e concordo que somente com o PHP você consegue fazer maravilhas. Mas entenda, Victor Gomes, o Smarty é uma ferramenta que te ajuda a trabalhar menos, ainda que te dê trabalho pra configurar uma vez, você trabalha menos no resto do projeto.
    Falo em trabalhar menos por experiência, pois usei Smarty como View e SQLReactor como Model e só tive que escrever a minha camada de Controller.
    Hoje em dia só uso UM template para os meus projetos quando não faço uso de Ajax. Com ele uso DOIS e o segundo só tem DUAS Smarty Tags e nenhum HTML. Nenhum deles tem, dentro de si, um script PHP ou Smarty sequer.
    Xiitismo não leva a nada, ninguém aqui disse que o Smarty envergonha o PHP ou o programador que o usa.

    Hítalo

    Acho muito mais interessante utilizar XSL, que garante uma saída de código bem formado e é extremamente dinâmica.

Lucas Correia

Não sou contra o Smarty, nem esses MVC da vida. No entanto, escrevo:

Name
Email
Phone

…e segue o baile!!

Mateus Souza

Esta discursão é longa… mas falando em performance, o Smarty não sai perdendo?

O PHP tem que ver no template a tag Smarty {$name}, depois processar essa tag, vendo se existe no índice de variáveis, pra depois exibir o valor dela… ou seja, para cada “echo”, são pelo menos 3 processos.

Já no PHP direto, é apenas um processo, “echo $name” e pronto…

Ainda prefiro fazer usando diretamente o PHP. Só para usar o Smarty, você tem que aprender uma nova linguagem. E já quem nem todos em uma equipe vão saber Smarty, fica complicado manter um APP usando Smarty, porque vai gerar mais custos.

    Victor Gomes

    Sim e não Mateus, como sabe a discussão aqui tá bem longa, vou tentar mostrar oque ocorre quando você usa variáveis no smarty.

    Existe esse caso que o autor do artigo mostrou usando {$name}, bem ai na verdade não tem nada de smarty. Já que os caracteres {} apenas fazem a separação da variável para uma string interpretada (aspas duplas) ou numa string literal (heredoc).

    Tem gente que vai dizer que você não precisa dos {} e concordo, mas é necessário quando vc vai imprimir um nó de array, exemplo:
    // PHP puro:
    $matriz = array(‘Round 1′,’Round 2′,’Round 3′);
    echo “Esta é uma string interpretada, exibindo o {$matriz[1]} da discussão.”;

    Se você rodar isso no PHP verá que será exibido ‘Round 2′ no lugar de ‘{$matriz[1]}’, ou seja o Smarty nesse caso específico ele não faz nada, apenas deixa com o PHP, oque passa a ser diferente quando usado como Smarty tag, exemplo:
    {$title|default:”Default Page Title”}
    Nesse caso o Smarty verifica se a variável $title foi declarada antes de exibir, se não mostra o “default”.

    Para esse último caso sim ele depende de um Wrapper. O que perde sim UM POUCO de performance, porém é compensado posteriormente pelo sistema de Cache do próprio Smarty.

    Eu já vi, mas hoje não vejo mais vantagem no Cache do Smarty, já que uso as soluções de Cache da própria Zend (não to falando do Zend Framework). Mas mudando de ambiente a percepção quanto ao Cache do Smarty pode mudar.

    Oque você diz sobre custos, e organização de equipe tbm tem a ver, parte de um sistema em uma empresa onde trabalhei tinha Smarty misturado com aquela famosa macarronada PHP. Logo começou o jogo de empurra-empurra entre os desenvolvedores. E sinceramente eu acho que vem dai meus arrepios ao ouvir Smarty.

    Mas isso é natural, existem ferramentas que são bem e mal utilizadas. Como o amigo Evaldo citou, para ele funcionou muito bem, e acho a sugestão dele muito válida.
    Já pra mim não funciona, desenvolvo com minha biblioteca de view para HTML5.

    Cabe a você mesmo ver se a ferramenta lhe serve ou não.

    Victor Gomes
    Zend Certified Engineer PHP5

    Wesley Willians Ramos da Silva

    Victor e sobre o {section}, etc, etc.. O php tem que fazer parsing sim.
    Por exemplo: {$nome|upper} tudo isso tem que ser parseado em algum momento.

    Trabalho com smarty desde quando lançou e também trabalho com PHP puro. Se você souber escrever PHP, sem dúvidas você cria um código bem bacana sem ter que aprender outra linguagem.

    Ricardo Schroeder

    Vocês só estão se esquecendo de um pequeno detalhe, o Smarty pode ser compilado para código PHP, então ele só vai fazer o processo de parser uma vez. Não sou a favor nem contra, cada projeto vai ter a sua necessidade, é bem mais fácil você ensinar para um designer as tags do Smarty do que toda a sintaxe do PHP (incluindo laços de repetição, estruturas de controle, etc).
    Vejo que o Smarty pode ser muito bem utilizado quando se trabalha em equipe, em um projeto grande com certeza seus benefícios são evidentes, temos que pensar acima de tudo que como toda ferramenta existe uma curva de aprendizado até dominá-lo.
    Realmente seu benefício maior está em implementar uma camada somente para a View (apesar de poder se obter o resultado com inúmeros padrões de projetos), e usar o Smarty não significa desenvolver em MVC….
    Enfim, se bem utilizado irá trazer benefícios, porém nenhum milagre.

Leonel Oliveira

O importante de tudo isso é sabermos que o PHP é poderoso e conta com algumas classes já desenvolvidas para quem não quer perder tempo com o desenvolvimento do ZERO, claro que se o seu projeto justifica desenvolver algo do inicio vá em frente mas se preferir usar algo já existente desde que saiba usá-lo podemos aproveitar muito bem o que já é pronto.

Abraços.

Manolo Freitas

Discussão em cima de open source sempre dá nisso … muitos “padrões” e nenhum padrão. Impossível encontrar uma linha de aprendizado maior que essa. Um dia você acha que sabe uma coisa, no outro alguém mudou o core do que você sabia, te obrigando a correr atrás da solução …

Guilherme Oderdenge

Concordo com o que o “Manolo Freitas” falou. Discussão encima do open source é sempre a mesma coisa: falam falam e não falam nada.

Quando comecei a programar em PHP, desenhava o layout da página dentro de um echo (sim, eu fazia isso). Então, sentindo dificuldade em desenvolver, fui atrás de uma solução e portanto achei – e ela nunca foi tão simples: adicionar os echos entre o layout. Pronto, bem mais simples! Foi aí que acabei achando feio e tinha certeza que havia outra(s) forma(s) de fazer.

Achei o Smarty, mas não estava com saco para entendê-lo, então encontrei o ““, que quebra um galhasso que só.

Convenhamos, cada vez mais que enchemos de frufru encima do nosso código, mais pesado ele fica. Um caso bastante real disso é o jQuery, que embora ele seja uma solução inovadora para desenvolvedores JS, ele direta ou indiretamente pesa na nossa página. E o Smarty não é uma exceção.

Viva o nativo.

Luis

“Quando você começa a repetir em todo lugar, ele fica bastante redundante e, francamente, feio.”

Por isso ele usa o Smarty ¬¬

deivison

Fala sério, não gosto de Smarty e tb infelismente não gostei da sua explicação, pois você tratou o básico do Smarty e conforme vamos aprofundando vamos nos deparando com mais dificuldades ao invéz de facilidades. Só uma coisa, na sua explicação acima você utilizou o echo e se ao invéz de utilizar o echo coloca-se assim isso para ilustrar a utilizacão acima, mas na verdade o Smarty há tempos ao meu ver já tinha cido atropelado pela classe Tiny But Strong, só que hoje em dia tanto o Smarty tanto o TBS são ferramentas desatualizadas. Hoje em dia temos uma variedade de frameworks incriveis como o cake, codeigniter, zend,… que massacra o Smarty. Só vejo antigas fábricas de softwares desatualizadas utilizando o Smarty

Brohack

Gosto é gosto, mas o que eu não aguento é ver os outros macular a imagem de um produto pelo simples motivo de NÃO GOSTAR DE USAR!

Quando eu vejo alguém falar em “dificuldades” em utilizar o Smarty e citar que o mais moderno é utilizar o ZEND, CAKE etc fico pensando como podemos aprender a utilizar um FRAMEWORK e ter complicações na utilização de uma ENGINE, sacou a diferença?!

Sou defensor pelos seguintes motivos:

- Utilização de cache;
- Fácil manutenção;
- Lógica PHP protegida das mãos inexperientes;
- Permite MVC;
- Fácil aplicação e desenvolvimento;
- Um site, vários layouts, sem precisar mudar uma linha de código PHP sequer, muito menos HTML!
- Imagina as famosas promoções de Páscoa, Natal, Dia das crianças que o clientes adoram layouts novos… Cria-se somente uma pasta nova com uma nova folha de estilos e pronto, e quando acaba a promoção volta para antiga setando somente uma variável e já era!
- Quem é a favor de misturar PHP com HTML não deveria obstar em fazer uso frequente da tag e colocar os scripts JS dentro de , ou pior não pode falar mal de quem utiliza a propriedade style das tags HTML!

Me fale quem conseguiu adicionar código malicioso via INJECTION no PHP utilizando falhas em uma TPL? Isto é totalmente possível quando você utiliza "includes", "requires" etc misturando PHP com HTML.

Só mais uma coisa que não posso deixar:

Utlizar "<?=" ao invés de "" você terá que pedir pelo amor de Deus para a short tags estar habiitada no servidor, principalmente se for uma revenda ou hospedagem de site comum que não permite a edição do PHP.INI.

Utilizar "<?=" não é mais rápido ou melhor que "" e sim um jeito mais "comodo" de programar! "echo" ainda não é e não vai ser "deprecated" no PHP 6, portanto seu uso não é condenável!

E pra que utilizar "<?" e correr o risco do meu código bugar se posso utilizar "<?php" e não correr riscos?!

Não precisa utilizar SMARTY, mas não seja irresponsável a ponto de querer impor seu gosto a pessoas que estão querendo ou gostam de utilizar!

JJ

Independente de defesa ou nao do Smarty, concordo plenamente com o Brohack.
O smarty realmente tem seus pontos positivos, ou negativos, que seja. Isso depende da aplicao pratica do mesmo.

Digo isso pq uso ele em conjunto com Ajax, e fica MUITO tranquilo, principalmente pq nessa “salada” de PHP, JAVA e HTML do ajax, o MVC pelo smarty facilita um monte a gestao de layout. Inclusive separando-se as camadas de desenvolvimento em cada nivel que se queira, interpolando ou nao novas camadas para controle de fluxo.

Bom, Acho o Zend bem bacana, mas nao acho que uma ou outra ferramenta seja unica e exclusivamente melhor que a outra. Tudo depende da aplicacao pratica da mesma.

Abs.

eDIVALDO

Como faço para personalizar o título da página que sai na barra de endereço do site?
Exemplo:

site.com/artigo sobre carros.html

eu quero colocar um hífen entre as palavras.
Ficaria assim:

site.com/artigo-sobre-carros.html

Eu já tentei achar este arquivo para substituir o espaço por um Hífen mas não encontrei. Eu utilizo SMARTY PARA PHP

Qual a sua opinião?