Nette Documentation Preview

syntax
Por que usar modelos?
*********************


Por que eu deveria usar um sistema de modelos em PHP? .[#toc-why-should-i-use-a-templating-system-in-php]
---------------------------------------------------------------------------------------------------------

Por que usar um sistema de modelos no PHP se o próprio PHP é uma linguagem de modelos?

Vamos primeiro recapitular brevemente a história dessa linguagem, que é cheia de reviravoltas interessantes. Uma das primeiras linguagens de programação usadas para gerar páginas HTML foi a linguagem C. No entanto, logo ficou claro que usá-la para esse fim não era prático. Rasmus Lerdorf criou então o PHP, que facilitou a geração de HTML dinâmico com a linguagem C no backend. O PHP foi originalmente projetado como uma linguagem de modelos, mas com o tempo adquiriu recursos adicionais e se tornou uma linguagem de programação completa.

No entanto, ele ainda funciona como uma linguagem de modelos. Um arquivo PHP pode conter uma página HTML, na qual as variáveis são geradas usando `<?= $foo ?>`, etc.

No início da história do PHP, foi criado o sistema de modelos Smarty, com o objetivo de separar estritamente a aparência (HTML/CSS) da lógica do aplicativo. Ele deliberadamente forneceu uma linguagem mais limitada do que o próprio PHP, de modo que, por exemplo, um desenvolvedor não poderia fazer uma consulta ao banco de dados a partir de um modelo, etc. Por outro lado, ela representava uma dependência adicional nos projetos, aumentava sua complexidade e exigia que os programadores aprendessem uma nova linguagem Smarty. Esses benefícios foram controversos, e o PHP simples continuou a ser usado para modelos.

Com o tempo, os sistemas de modelos começaram a se tornar úteis. Eles introduziram conceitos como [herança |template-inheritance], [modo sandbox |sandbox] e uma série de outros recursos que simplificaram significativamente a criação de modelos em comparação com o PHP puro. O tópico de segurança, a existência de [vulnerabilidades como XSS |safety-first] e a necessidade de [escape |#What is escaping] vieram à tona. Os sistemas de modelos introduziram o escape automático para eliminar o risco de um programador esquecê-lo e criar uma grave falha de segurança (veremos em breve que isso tem algumas armadilhas).

Atualmente, os benefícios dos sistemas de modelos superam em muito os custos associados à sua implementação. Portanto, faz sentido usá-los.


Por que o Latte é melhor que o Twig ou o Blade? .[#toc-why-is-latte-better-than-twig-or-blade]
----------------------------------------------------------------------------------------------

Há vários motivos - alguns são agradáveis e outros são imensamente úteis. O Latte é uma combinação de agradável e útil.

*Primeiro, o agradável:* O Latte tem a mesma [sintaxe do PHP |syntax#Latte Understands PHP]. A única diferença está na notação das tags, preferindo `{` e `}` mais curtos em vez de `<?=` e `?>`. Isso significa que você não precisa aprender um novo idioma. Os custos de treinamento são mínimos. O mais importante é que, durante o desenvolvimento, você não precisa "alternar" constantemente entre a linguagem PHP e a linguagem do modelo, pois ambas são a mesma. Isso é diferente dos modelos Twig, que usam a linguagem Python, forçando o programador a alternar entre duas linguagens diferentes.

*Agora, o motivo extremamente útil:* Todos os sistemas de modelos, como Twig, Blade ou Smarty, evoluíram para incluir proteção contra XSS na forma de [escape |#What is escaping] automático. Mais precisamente, a chamada automática da função `htmlspecialchars()`. Entretanto, os criadores do Latte perceberam que essa não é a solução correta. Isso ocorre porque diferentes partes do documento exigem diferentes métodos de escape. O escape automático ingênuo é um recurso perigoso porque cria uma falsa sensação de segurança.

Para que o escape automático seja funcional e confiável, ele deve reconhecer em que parte do documento os dados estão sendo gerados (chamamos isso de contextos) e escolher a função de escape de acordo. Portanto, ele deve ser [sensível ao contexto |safety-first#Context-Aware Escaping]. E é isso que o Latte pode fazer. Ele entende HTML. Ele não percebe o modelo como apenas uma sequência de caracteres, mas entende o que são tags, atributos etc. Portanto, ele faz escapes diferentes no texto HTML, nas tags HTML, no JavaScript etc.

O Latte é o primeiro e único sistema de modelos PHP com escape sensível ao contexto. Ele representa o único sistema de modelos realmente seguro.

*E outro motivo agradável: como o Latte entende HTML, ele oferece outros recursos muito agradáveis. Por exemplo, [n:attributes |syntax#n:attributes]. Ou a capacidade de [verificar links |safety-first#Link checking]. E muito mais.


O que é escape? .[#toc-what-is-escaping]
----------------------------------------

Escaping é um processo que envolve a substituição de caracteres com significados especiais por sequências correspondentes ao inserir uma cadeia de caracteres em outra para evitar efeitos indesejados ou erros. Por exemplo, ao inserir uma cadeia de caracteres em um texto HTML, no qual o caractere `<` tem um significado especial porque indica o início de uma tag, nós o substituímos pela sequência correspondente, que é a entidade HTML `&lt;`. Isso permite que o navegador exiba corretamente o símbolo `<`.

Um exemplo simples de escape direto ao escrever código PHP é inserir uma aspa em uma cadeia de caracteres colocando uma barra invertida na frente dela.

Discutiremos o escape em mais detalhes no capítulo [Como se defender contra XSS |safety-first#How to Defend Against XSS?].


Uma consulta ao banco de dados pode ser executada em um modelo Latte? .[#toc-can-a-database-query-be-executed-from-a-latte-template]
------------------------------------------------------------------------------------------------------------------------------------

Nos modelos, você pode trabalhar com objetos que o programador passa para eles. Se o programador quiser, ele poderá passar um objeto de banco de dados para o modelo e executar uma consulta. Se ele pretende fazer isso, não há motivo para impedi-lo.

Uma situação diferente ocorre se você quiser dar aos clientes ou programadores externos a capacidade de editar modelos. Nesse caso, você definitivamente não quer que eles tenham acesso ao banco de dados. É claro que você não passará o objeto de banco de dados para o modelo, mas e se ele puder ser acessado por meio de outro objeto? A solução é o [modo sandbox |sandbox], que permite que você defina quais métodos podem ser chamados nos modelos. Graças a isso, você não precisa se preocupar com violações de segurança.


Quais são as principais diferenças entre sistemas de gabaritos como Latte, Twig e Blade? .[#toc-what-are-the-main-differences-between-templating-systems-like-latte-twig-and-blade]
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

As diferenças entre sistemas de modelos como Latte, Twig e Blade residem principalmente em sua sintaxe, segurança e integração com as estruturas:

- Latte: utiliza a sintaxe da linguagem PHP, facilitando a aprendizagem e o uso. Ele oferece proteção de primeira linha contra ataques XSS.
- Twig: utiliza uma sintaxe parecida com a do Python, que é bem diferente do PHP. Ele escapa sem distinção de contexto. Está bem integrado com a estrutura Symfony.
- Blade: utiliza uma mistura de PHP e sintaxe personalizada. Ela escapa sem distinção de contexto. Está bem integrado com as características de Laravel e o ecossistema.


Vale a pena para as empresas usar um sistema de modelos? .[#toc-is-it-worth-it-for-companies-to-use-a-templating-system]
------------------------------------------------------------------------------------------------------------------------

Em primeiro lugar, os custos associados ao treinamento, ao uso e aos benefícios gerais variam significativamente dependendo do sistema. O sistema de modelos Latte, graças ao seu uso da sintaxe PHP, simplifica muito o aprendizado para programadores já familiarizados com esta linguagem. Normalmente leva algumas horas para que um programador se familiarize suficientemente com o Latte, reduzindo os custos de treinamento e acelerando a adoção da tecnologia e, o mais importante, a eficiência no uso diário.

Além disso, Latte oferece um alto nível de proteção contra a vulnerabilidade XSS, graças a sua tecnologia de escape sensível ao contexto único. Esta proteção é crucial para garantir a segurança das aplicações web e minimizar o risco de ataques que possam colocar em risco os usuários ou os dados da empresa. A segurança das aplicações web também é importante para manter a boa reputação de uma empresa. As questões de segurança podem levar à perda de confiança dos clientes e prejudicar a reputação da empresa no mercado.

O uso do Latte também reduz os custos gerais de desenvolvimento e manutenção, tornando ambos mais fáceis. Portanto, o uso de um sistema de modelos vale definitivamente a pena.


O Latte afeta o desempenho dos aplicativos da Web? .[#toc-does-latte-affect-the-performance-of-web-applications]
----------------------------------------------------------------------------------------------------------------

Embora os modelos Latte sejam processados rapidamente, este aspecto realmente não importa. A razão é que os arquivos de análise ocorrem apenas uma vez durante a primeira exibição. Eles são então compilados em código PHP, armazenados em disco e executados em cada solicitação subseqüente sem necessidade de recompilação.

É assim que funciona em um ambiente de produção. Durante o desenvolvimento, os modelos Latte são recompilados cada vez que seu conteúdo muda, de modo que o desenvolvedor sempre vê a versão atual.

Por que usar modelos?

Por que eu deveria usar um sistema de modelos em PHP?

Por que usar um sistema de modelos no PHP se o próprio PHP é uma linguagem de modelos?

Vamos primeiro recapitular brevemente a história dessa linguagem, que é cheia de reviravoltas interessantes. Uma das primeiras linguagens de programação usadas para gerar páginas HTML foi a linguagem C. No entanto, logo ficou claro que usá-la para esse fim não era prático. Rasmus Lerdorf criou então o PHP, que facilitou a geração de HTML dinâmico com a linguagem C no backend. O PHP foi originalmente projetado como uma linguagem de modelos, mas com o tempo adquiriu recursos adicionais e se tornou uma linguagem de programação completa.

No entanto, ele ainda funciona como uma linguagem de modelos. Um arquivo PHP pode conter uma página HTML, na qual as variáveis são geradas usando <?= $foo ?>, etc.

No início da história do PHP, foi criado o sistema de modelos Smarty, com o objetivo de separar estritamente a aparência (HTML/CSS) da lógica do aplicativo. Ele deliberadamente forneceu uma linguagem mais limitada do que o próprio PHP, de modo que, por exemplo, um desenvolvedor não poderia fazer uma consulta ao banco de dados a partir de um modelo, etc. Por outro lado, ela representava uma dependência adicional nos projetos, aumentava sua complexidade e exigia que os programadores aprendessem uma nova linguagem Smarty. Esses benefícios foram controversos, e o PHP simples continuou a ser usado para modelos.

Com o tempo, os sistemas de modelos começaram a se tornar úteis. Eles introduziram conceitos como herança, modo sandbox e uma série de outros recursos que simplificaram significativamente a criação de modelos em comparação com o PHP puro. O tópico de segurança, a existência de vulnerabilidades como XSS e a necessidade de escape vieram à tona. Os sistemas de modelos introduziram o escape automático para eliminar o risco de um programador esquecê-lo e criar uma grave falha de segurança (veremos em breve que isso tem algumas armadilhas).

Atualmente, os benefícios dos sistemas de modelos superam em muito os custos associados à sua implementação. Portanto, faz sentido usá-los.

Por que o Latte é melhor que o Twig ou o Blade?

Há vários motivos – alguns são agradáveis e outros são imensamente úteis. O Latte é uma combinação de agradável e útil.

Primeiro, o agradável: O Latte tem a mesma sintaxe do PHP. A única diferença está na notação das tags, preferindo { e } mais curtos em vez de <?= e ?>. Isso significa que você não precisa aprender um novo idioma. Os custos de treinamento são mínimos. O mais importante é que, durante o desenvolvimento, você não precisa „alternar“ constantemente entre a linguagem PHP e a linguagem do modelo, pois ambas são a mesma. Isso é diferente dos modelos Twig, que usam a linguagem Python, forçando o programador a alternar entre duas linguagens diferentes.

Agora, o motivo extremamente útil: Todos os sistemas de modelos, como Twig, Blade ou Smarty, evoluíram para incluir proteção contra XSS na forma de escape automático. Mais precisamente, a chamada automática da função htmlspecialchars(). Entretanto, os criadores do Latte perceberam que essa não é a solução correta. Isso ocorre porque diferentes partes do documento exigem diferentes métodos de escape. O escape automático ingênuo é um recurso perigoso porque cria uma falsa sensação de segurança.

Para que o escape automático seja funcional e confiável, ele deve reconhecer em que parte do documento os dados estão sendo gerados (chamamos isso de contextos) e escolher a função de escape de acordo. Portanto, ele deve ser sensível ao contexto. E é isso que o Latte pode fazer. Ele entende HTML. Ele não percebe o modelo como apenas uma sequência de caracteres, mas entende o que são tags, atributos etc. Portanto, ele faz escapes diferentes no texto HTML, nas tags HTML, no JavaScript etc.

O Latte é o primeiro e único sistema de modelos PHP com escape sensível ao contexto. Ele representa o único sistema de modelos realmente seguro.

*E outro motivo agradável: como o Latte entende HTML, ele oferece outros recursos muito agradáveis. Por exemplo, n:attributes. Ou a capacidade de verificar links. E muito mais.

O que é escape?

Escaping é um processo que envolve a substituição de caracteres com significados especiais por sequências correspondentes ao inserir uma cadeia de caracteres em outra para evitar efeitos indesejados ou erros. Por exemplo, ao inserir uma cadeia de caracteres em um texto HTML, no qual o caractere < tem um significado especial porque indica o início de uma tag, nós o substituímos pela sequência correspondente, que é a entidade HTML &lt;. Isso permite que o navegador exiba corretamente o símbolo <.

Um exemplo simples de escape direto ao escrever código PHP é inserir uma aspa em uma cadeia de caracteres colocando uma barra invertida na frente dela.

Discutiremos o escape em mais detalhes no capítulo Como se defender contra XSS.

Uma consulta ao banco de dados pode ser executada em um modelo Latte?

Nos modelos, você pode trabalhar com objetos que o programador passa para eles. Se o programador quiser, ele poderá passar um objeto de banco de dados para o modelo e executar uma consulta. Se ele pretende fazer isso, não há motivo para impedi-lo.

Uma situação diferente ocorre se você quiser dar aos clientes ou programadores externos a capacidade de editar modelos. Nesse caso, você definitivamente não quer que eles tenham acesso ao banco de dados. É claro que você não passará o objeto de banco de dados para o modelo, mas e se ele puder ser acessado por meio de outro objeto? A solução é o modo sandbox, que permite que você defina quais métodos podem ser chamados nos modelos. Graças a isso, você não precisa se preocupar com violações de segurança.

Quais são as principais diferenças entre sistemas de gabaritos como Latte, Twig e Blade?

As diferenças entre sistemas de modelos como Latte, Twig e Blade residem principalmente em sua sintaxe, segurança e integração com as estruturas:

  • Latte: utiliza a sintaxe da linguagem PHP, facilitando a aprendizagem e o uso. Ele oferece proteção de primeira linha contra ataques XSS.
  • Twig: utiliza uma sintaxe parecida com a do Python, que é bem diferente do PHP. Ele escapa sem distinção de contexto. Está bem integrado com a estrutura Symfony.
  • Blade: utiliza uma mistura de PHP e sintaxe personalizada. Ela escapa sem distinção de contexto. Está bem integrado com as características de Laravel e o ecossistema.

Vale a pena para as empresas usar um sistema de modelos?

Em primeiro lugar, os custos associados ao treinamento, ao uso e aos benefícios gerais variam significativamente dependendo do sistema. O sistema de modelos Latte, graças ao seu uso da sintaxe PHP, simplifica muito o aprendizado para programadores já familiarizados com esta linguagem. Normalmente leva algumas horas para que um programador se familiarize suficientemente com o Latte, reduzindo os custos de treinamento e acelerando a adoção da tecnologia e, o mais importante, a eficiência no uso diário.

Além disso, Latte oferece um alto nível de proteção contra a vulnerabilidade XSS, graças a sua tecnologia de escape sensível ao contexto único. Esta proteção é crucial para garantir a segurança das aplicações web e minimizar o risco de ataques que possam colocar em risco os usuários ou os dados da empresa. A segurança das aplicações web também é importante para manter a boa reputação de uma empresa. As questões de segurança podem levar à perda de confiança dos clientes e prejudicar a reputação da empresa no mercado.

O uso do Latte também reduz os custos gerais de desenvolvimento e manutenção, tornando ambos mais fáceis. Portanto, o uso de um sistema de modelos vale definitivamente a pena.

O Latte afeta o desempenho dos aplicativos da Web?

Embora os modelos Latte sejam processados rapidamente, este aspecto realmente não importa. A razão é que os arquivos de análise ocorrem apenas uma vez durante a primeira exibição. Eles são então compilados em código PHP, armazenados em disco e executados em cada solicitação subseqüente sem necessidade de recompilação.

É assim que funciona em um ambiente de produção. Durante o desenvolvimento, os modelos Latte são recompilados cada vez que seu conteúdo muda, de modo que o desenvolvedor sempre vê a versão atual.