Prosím o otestování Latte 3.0.7

David Grudl
Nette Core | 8139
+
+4
-

Prosím o otestování Latte 3.0.7 RC

composer require latte/latte:^3.0.7-RC2

Vylepšení se týkají především PHP parseru a AST uzlů, tedy jde o věci skryté pod kapotou, ale pár novinek je i pro uživatele:

Latte můžete nově nastavit cestu k binárce PHP a ono bude pomocí ní kontrolovat správnost vygenerovaných šablon (linter). K čemu je to dobré? Latte samozřejmě generuje syntakticky korektní PHP kód (pochopitelně to nemůže zaručit u rozšířeních třetích stran). Ale může se stát, že v kódu bude kompilační chyba. Tou je například zápis do proměnné $this. Jelikož PHP eviduje na dvě stovky různých zakázaných operací, není ambicí Latte je všechny hlídat. Pokud takovou věc uděláte v šabloně, dostane se do zkompilované podoby a na chybu upozorní až následně PHP při vykreslování.

Problém je, že PHP se ke kompilačním chybám chová jako ve své páté verzi: nelze je zachytit a okamžitě vedou k ukončení aplikace. Při vývoji to obvykle nepředstavuje problém, protože nezachycujeme ani žádné jiné chyby Latte a každá vždy probublá až do červené Laděnky. Pokud ale naopak potřebujete s chybami pracovat a mít jistotu, že šablona je z pohledu PHP kompilátoru zcela ok, třeba při uživatelsky editovatelným šablonám nebo použití sandboxu, je řešením právě využití linteru:

$latte = new Latte\Engine;
$latte->enablePhpLinter('/path/to/php');
try {
	$latte->compile('home.latte');
} catch (Latte\CompileException $e) {
	// nyní zachytí i kompilační chyby PHP
	echo 'Error: ' . $e->getMessage();
}

Doplnění:

Ještě jsem předělal a vylepšil práci s HTML atributy. Latte by mělo být zase o něco šikovnější a bezpečnější. Nyní považuje za nevalidní tuto konstrukci:

<input value={if $foo}"a"{/if} checked></span>  // CHYBA

Důvod je logický – pokud by se část vnitř značek nevypsala, vzniklo by vlastně <input value=checked>, což nechceš. Správná verze je:

<input value="{if $foo}a{/if}" checked></span>  // OK
Marek Bartoš
Nette Blogger | 1173
+
+1
-

Nešel by ten lint nastavit automaticky?

Případně mít metodu enablePhpLint(string $binary = PHP_BINARY). Ať je jasné co to dělá a jako výchozí je aktuální binárka.

Editoval Marek Bartoš (8. 8. 2023 12:46)

David Grudl
Nette Core | 8139
+
0
-

PHP_BINARY je cesta k binárce, jen pokud pouštíš z PHP z příkazové řádky. Na serverech to vede k php-fpm nebo httpd z Apache.

Metodu přejmenuju.

Marek Bartoš
Nette Blogger | 1173
+
0
-

Pro webserver se jako fallback dá použít shell_exec('which php'). Ale koukám, že v linter skriptu PHP_BINARY používáš, good enough :)