Latte: ¿cómo utilizar el sistema de tipos?

hace 5 años por David Grudl  

El sistema de tipos es lo principal para el desarrollo de aplicaciones robustas. Los tipos en PHP tienen una superioridad sobre otros lenguajes dinámicos como Python, Ruby o JavaScript. Nette Framework lleva a los programadores a producir código tipado y estricto desde el principio. Latte 2.7 trajo el soporte de tipos a las plantillas también.

Saber qué tipo de dato u objeto es cada variable permite a

  • IDE autocompletar correctamente
  • análisis estático para detectar errores

Dos puntos que mejoran notablemente la calidad y la comodidad del desarrollo.

¿Cómo declarar tipos en PHP?

Pasaremos los datos a la plantilla como un objeto de una clase que define todas las variables y sus tipos. Usando las nuevas características de PHP 7.4, podría verse así:

class MailTemplate
{
	public string $lang = 'cs';
	public Address $address;
	public string $subject;
	public ?float $price = null;
}

Uso:

$template = new MailTemplate;
$template->price = $this->getPrice();
...
$latte->render('mail.latte', $template);

Adición: gracias a las nuevas características de PHP 8, el ejemplo se puede escribir de forma más interesante así:

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,
));

¿Cómo declarar tipos en una plantilla?

Ahora podemos asociar esa clase a la plantilla. Sólo tenemos que declararlo al principio:

{templateType MailTemplate}

Y con eso, hemos definido que la plantilla contendrá un cuarteto de variables $lang, $address, $subject y $price incluyendo sus respectivos tipos.

La alternativa es definir los tipos de cada variable directamente en la plantilla, es decir, sin crear una clase. Para ello se utiliza la etiqueta {varType}:

{varType string $lang}
{varType Address $address}

Por supuesto, se pueden combinar ambas opciones. Cree una clase, ya que esto asegurará la finalización en el lado del presentador, enlácela a la plantilla usando {templateType} y use {varType} para otras variables locales en bloques, etc. Esto puede entenderse como una analogía /** @var type $variable */, que es un comentario que a veces usamos en el código PHP para instruir al IDE o a la herramienta de análisis estático.

También, el tipo puede ser especificado en {var}, {default} o {define}:

{var Model\Page $page = $items['page']}
{define form, string $name}
	...
{/define}

Nota: por razones históricas, era posible escribir variables en las etiquetas {var} y {default} sin el signo de dólar inicial. Debido a que esto crea ambigüedad sobre si es un tipo o una variable, esta sintaxis está obsoleta y Latte le advertirá cuando la utilice.

¿Cómo simplificas tu trabajo?

¿Cómo escribir una clase de plantilla o {varType} lo más fácil posible? Consiga que se generen. Eso es precisamente lo que hacen el par de etiquetas {templatePrint} y {varPrint}.

Si colocas una de estas etiquetas en una plantilla, se mostrará el código de la clase o plantilla en lugar de la representación normal. A continuación, sólo tienes que seleccionar y copiar el código en tu proyecto.

Nette/application 3.1 (beta) incluye una etiqueta sobrecargada {templatePrint} que genera un código más adecuado para los presentadores.

La etiqueta {varPrint} enumera las variables locales que no son parámetros de plantilla. Si desea listar todas las variables, utilice {varPrint all}.

Completado de código IDE

La última versión del plugin PhpStorm Latte puede aprovechar las etiquetas anteriores y luego sugerir basándose en los tipos. El plugin también conoce los tipos de variables estándar como $user, $presenter, $basePath, etc.

Análisis estático

El objetivo final es que todos los tipos declarados puedan ser utilizados también para el análisis estático. Por ejemplo, usar PHPStan para comprobar plantillas tan fácilmente como otros ficheros PHP.

Estamos trabajando en esto y lo verás en una de las próximas versiones de Latte.