Latte: como usar o sistema de tipo?
O sistema de tipo é a coisa principal para o desenvolvimento de aplicações robustas. Os tipos em PHP têm uma superioridade sobre outras linguagens dinâmicas, como Python, Ruby ou JavaScript. O Nette Framework leva os programadores a produzir código digitado e rígido desde o início. O Latte 2.7 trouxe o suporte a tipos também para os templates.
Para saber quais dados ou tipo de objeto cada variável permite
- IDE para autocompletar corretamente
- análise estática para detectar erros
Dois pontos que melhoram significativamente a qualidade e a conveniência do desenvolvimento.
Como declarar os tipos no lado PHP?
Passaremos dados para o modelo como objeto de uma classe que define todas as variáveis e seus tipos. Usando as novas características do PHP 7.4, poderia ser assim:
class MailTemplate
{
public string $lang = 'cs';
public Address $address;
public string $subject;
public ?float $price = null;
}
Utilização:
$template = new MailTemplate;
$template->price = $this->getPrice();
...
$latte->render('mail.latte', $template);
Adição: graças às novas características do PHP 8, o exemplo pode ser escrito de forma mais interessante desta forma:
class MailTemplate
{
public function __construct(
public string $lang = 'cs',
public Address $address,
public string $subject,
public ?float $price = null,
) {}
}
$latte->render('mail.latte', new MailTemplate(
lang: $this->lang,
subject: $title,
price: $this->getPrice(),
address: $userAddress,
));
Como declarar os tipos em um modelo?
Agora podemos associar essa classe com o modelo. Só precisamos declará-la no início:
{templateType MailTemplate}
E com isso, definimos que o modelo conterá um quarteto de variáveis
$lang
, $address
, $subject
e
$price
incluindo seus respectivos tipos.
A alternativa é definir os tipos de cada variável diretamente no modelo,
ou seja, sem criar uma classe. A etiqueta {varType}
é usada para
este fim:
{varType string $lang}
{varType Address $address}
É claro, ambos podem ser combinados. Crie uma classe, pois isso garantirá a
conclusão no lado do apresentador, conecte-a ao modelo usando
{templateType}
e use {varType}
para outras variáveis
locais em blocos, etc. Isto pode ser entendido como uma analogia
/** @var type $variable */
, que é um comentário que às vezes
usamos em código PHP para instruir IDE ou ferramenta de análise estática.
Também, o tipo pode ser especificado em {var}
,
{default}
ou {define}
:
{var Model\Page $page = $items['page']}
{define form, string $name}
...
{/define}
Nota: por razões históricas, foi possível escrever variáveis nas tags
{var}
e {default}
sem o principal sinal de dólar.
Como isto cria ambigüidade, quer seja um tipo ou uma variável, esta sintaxe é
depreciada e Latte o advertirá quando você a utilizar.
Como você simplifica seu trabalho?
Como escrever uma classe modelo ou {varType}
o mais fácil
possível? Faça com que sejam gerados. É exatamente isso que fazem os pares de
tags {templatePrint}
e {varPrint}
.
Se você colocar uma dessas tags em um modelo, o código de classe ou modelo será exibido em vez da renderização normal. Em seguida, basta selecionar e copiar o código em seu projeto.
Nette/aplicação 3.1 (beta) inclui uma etiqueta sobrecarregada
{templatePrint}
que gera um código mais adequado para
apresentadores.
A tag {varPrint}
lista variáveis locais que não são
parâmetros de modelo. Se você quiser listar todas as variáveis, use
{varPrint all}
.
Conclusão do código IDE
A última versão do plugin PhpStorm Latte pode tirar proveito das tags
acima e depois sugerir com base nos tipos. O plugin também conhece os tipos de
variáveis padrão, tais como $user
, $presenter
,
$basePath
, etc.
Análise estática
O objetivo final é que todos os tipos declarados também possam ser usados para análise estática. Por exemplo, usar o PHPStan para verificar os modelos tão facilmente quanto outros arquivos PHP.
Estamos trabalhando nisso e você verá isso em uma das próximas versões do Latte.
Para enviar um comentário, faça o login