Méně boilerplate, víc typů: co přináší #[TemplateVariable]
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.
Chcete-li odeslat komentář, přihlaste se