Latte: como usar o sistema de tipo?

há 5 anos De David Grudl  

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.