Latte: jak na typový systém?

před 28 dny od David Grudl     edit

Typový systém. Klíčová záležitost pro vývoj robustních aplikací, ve které získalo PHP velký náskok před dynamickými jazyky jako je Python, Ruby nebo JavaScript. Framework Nette od počátku programátory k typovému a striktnímu programování vede. Latte 2.7 přineslo podporou typů i do šablon.

Díky tomu, že víme, jaký datový či objektový typ je v každé proměnné, může

  • IDE správně našeptávat
  • statická analýza odhalit chyby

Dva body, které zásadním způsobem zvyšují kvalitu a pohodlí vývoje.

Jak deklarovat typy?

Před třemi lety vyšel tady na blogu tip na napovídání v šablonách v presenteru. Myšlenka spočívá v tom, že vytvoříme třídu, která definuje seznam všech proměnných a jejich typů. S využitím nových vlastností PHP 7.4 by mohla vypadat třeba takto:

namespace App\Presenters;

class ArticleTemplate extends Nette\Bridges\ApplicationLatte\Template
{
	public ArticlePresenter $presenter;
	public string $lang;
	public int $page;
	public Model\Page $article;
}

Tuhle třídu můžeme nyní použít i v šabloně. Stačí uvést na začátek:

{templateType App\Presenters\ArticleTemplate}

A tím jsme definovali, že v šabloně bude čtveřice proměnných $presenter, $lang, $page a $article včetně příslušných typů.

Alternativou je definovat typy jednotlivých proměnných přímo v šabloně, tj. bez vytváření třídy. K tomu slouží značka {varType}:

{varType App\Presenters\ArticlePresenter $presenter}
{varType string $lang}
{varType int $page}
{varType Model\Page $article}

Samozřejmě lze kombinovat obojí. Vytvořit třídu, protože tím zajistíme našeptávání na straně presenteru, propojit ji se šablonou pomocí {templateType} a pro ostatní lokální proměnné v blocích apod. používat {varType}. Které můžeme chápat jako obdobu /** @var type $variable */, což je komentář, kterým občas v PHP kódu instruujeme IDE nebo statický analyzér.

Nově lze typ uvést také ve značkách {var}, {default} nebo {define}:

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

Poznámka: z historických důvodů bylo možné ve značkách {var} a {default} psát proměnné i bez úvodního dolaru (a šipkou místo rovnítka). Protože to vytváří nejednoznačnost, zda jde o typ nebo proměnnou, je tato syntaxe zapovězená a Latte vás bude při jejím použití varovat. Jednoduchý způsob jak prohledat své šablony, jestli tam tento starý zápis nemáte, je hledat regulární výrazy /\{(var|default) [^$]/ a /\{(var|default) [^}]*=>/.

Jak si ušetřit práci?

Jak co nejsnáze napsat třídu šablony nebo značky {varType}? Nechte si je vygenerovat. Právě od toho existuje dvojice značek {templatePrint} a {varPrint}.

Pokud některou z těchto značek umístíte do šablony, místo běžného vykreslení se zobrazí návrh kódu třídy resp. seznam značek {varPrint}. Kód pak stačí jedním kliknutím označit a zkopírovat do projektu.

Součástí nette/application 3.1 (v beta verzi) je přetížená značka {templatePrint}, která generuje kód lépe uzpůsobený pro presentery.

Značka {varPrint} vypisuje lokální proměnné, které nejsou parametry šablony. Pokud chcete vypsat všechny proměnné, použijte {varPrint all}.

Našeptávání v IDE

Nejnovější verze Latte pluginu pro PhpStorm umí využít výše uvedených značek a poté napovídat na základě typů. Plugin zároveň zná typy standardních proměnných jako je třeba $user, $presenter, $basePath atd.

Viz také rozhovor s Matoušem o novinkách v pluginech pro PhpStorm.

Statická analýza

Cílem je, aby se daly všechny deklarované typy použít také pro statickou analýzu. Aby například pomocí PHPStan bylo možné kontrolovat šablony stejně snadno, jako jiné PHP soubory.

Na tomhle pracujeme a dočkáte se v některé z příštích verzí Latte.

Komentáře (RSS)

  1. Rychlá kontrola {var} a {default} z CLI:

    grep -rE --include '*.latte' '\{(var|default) ([^$]|[^}]*=>)'
    před 10 dny

Chcete-li odeslat komentář, přihlaste se