Méně boilerplate, víc typů: co přináší #[TemplateVariable]

před 2 hodinami od David Grudl  

Jsou situace, kdy presenter přirozeně operuje nad konkrétním doménovým objektem (např. článkem, objednávkou, uživatelem…) a typicky si ho drží v property. A současně ho potřebujete i v Latte šabloně. Doteď to znamenalo další řádek s $this->template->…

V Nette Framework v3.2.9 ale přibyla elegantní drobnost: atribut #[TemplateVariable]. Stačí označit property presenteru tímto atributem (nesmí být private) a ona se automaticky zpřístupní v šabloně pod stejným názvem:

<?php
declare(strict_types=1);

namespace App\Presentation\Article;

use Nette\Application\Attributes\TemplateVariable;
use Nette\Application\UI\Presenter;

final class ArticlePresenter extends Presenter
{
	#[TemplateVariable]
	public string $siteName = 'Můj blog';

	#[TemplateVariable]
	public ?Model\Article $article = null;

	public function actionShow(int $id): void
	{
		$this->article = $this->articleFacade->getById($id);
	}
}

V šabloně pak prostě použijete $siteName a $article bez dalšího drátování.

Pokud ale do šablony vložíte proměnnou se stejným názvem přes $this->template->…, tak #[TemplateVariable] ji nepřepíše. Jinými slovy, když už v šabloně proměnná existuje, atribut ji nechá být.

Nejsnadnější typované šablony

Na #[TemplateVariable] je zajímavé i to, že přirozeně vede k používání typovaných properties jako zdroje dat pro šablonu. Typy kontroluje už samotné PHP (a IDE i statická analýza je vidí), takže místo dynamického zapisování do $this->template pracujete s normálními, typově jasnými hodnotami (Article, bool, string…).

Nette má pro typově bezpečné šablony plnohodnotnou cestu – vlastní třídu šablony, kde jsou typy proměnných definované explicitně a $this->template pak není „pytel“, ale objekt s jasným API.

Když to vezmeme čistě experimentálně, #[TemplateVariable] může být příjemná minimalistická varianta pro menší a střední případy: nechcete zavádět novou třídu šablony, ale chcete mít v kódu pořádek a typy pod kontrolou. A až projekt vyroste, můžete kdykoli přejít na přísně typované šablony tou „velkou“ cestou.

David Grudl Tvůrce open-source projektů a specialista na AI, který lidem otevírá dveře do světa umělé inteligence. Jeho projekty Nette a další používají weby, které denně navštěvujete. Píše na Uměligence, La Trine a moderuje Tech Guys. Organizuje AI workshopy a věří, že technologie mají smysl jen tehdy, když lidem skutečně pomohou.