Prosím o otestování Latte 3.0.7
- David Grudl
- Nette Core | 8218
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:
- lze použít
{exitIf}
uvnitř{define}
- dynamic class constant fetch support in PHP 8.3
- nová metoda
Latte\Engine::enablePhpLinter()
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 | 1260
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 | 8218
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 | 1260
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 :)