Bez eval()
Każde wyrażenie przechodzi przez rekurencyjny parser gramatyki zamiast generowania kodu przez preg_replace. Wywołania funkcji, "::" i wywołania metod są kategorycznie wykluczone.
Silnik Szablonów PHP
Lekki silnik szablonów PHP, który wyraźnie oddziela logikę od prezentacji – bez eval(), z domyślnym, ścisłym automatycznym escapowaniem i opcjonalną piaskownicą bezpieczeństwa dla środowisk z wieloma autorami szablonów.
v15 · zewnętrzny audyt bezpieczeństwa · PHP 8.1+ · brak zależności
UIEngine kompiluje własną, kompaktową składnię szablonów (pliki .tpl) do cache’owanego PHP. W przeciwieństwie do wcześniejszej wersji, obecny kompilator nigdy nie korzysta z surowego podstawiania tekstu: każde wyrażenie przechodzi przez rekurencyjny parser gramatyki, który dopuszcza tylko ustalony, zweryfikowany zestaw konstrukcji – zmienne, operatory porównania, dostęp do tablic/obiektów, ale żadnych wywołań funkcji ani metod, ani ::.
Efekt: autorzy szablonów otrzymują znajomą składnię w stylu Smarty z dziedziczeniem, includami, modyfikatorami i własnymi pluginami – deweloperzy zachowują pełną kontrolę nad tym, co szablon może w ogóle wykonać.
Każde wyrażenie przechodzi przez rekurencyjny parser gramatyki zamiast generowania kodu przez preg_replace. Wywołania funkcji, "::" i wywołania metod są kategorycznie wykluczone.
Wyjście {$var} jest domyślnie escapowane jako HTML. Kto chce surowego wyjścia, musi zażądać tego jawnie przez |raw – nigdy odwrotnie.
{extends}, {block}, {parent} i {include} do wielokrotnie używanych layoutów, a do tego {function} do własnych makr szablonów.
Opcjonalne ograniczenia: dozwolone modyfikatory, widoczne stałe PHP, dodatkowe katalogi szablonów, blokada {eval}, {fetch} tylko z jawnym zezwoleniem.
Skompilowane szablony są cache’owane, całe strony opcjonalnie przez display($tpl,$id,$lifetime) – dynamiczne fragmenty pozostają aktywne dzięki {nocache}.
Czyste PHP 8.1+, własny autoloader PSR-4 do użycia bez Composera, ale działa równie dobrze z nim.
Fragment typowej strony z dziedziczeniem, warunkiem i pętlą:
{extends 'layout.tpl'}
{block content}
{if $user}
Hallo {$user->name}!
{else}
Hallo Gast!
{/if}
<ul>
{foreach $items as $item}
<li>{$item.name} – {$item.price|number_format:2}€</li>
{/foreach}
</ul>
{/block}
Gramatyka wyrażeń to centralny mechanizm bezpieczeństwa silnika, a nie filtr dodany później. Ścieżki dla {include} oraz plików konfiguracyjnych są rozwiązywane przez realpath() i sprawdzane względem dozwolonego katalogu, zanim jakikolwiek plik zostanie odczytany. W wersji v15 silnik przeszedł dodatkowo zewnętrzny audyt – wszystkie znalezione problemy zostały naprawione, zobacz informacje o wersji.
Pierwsza strona zadziała w kilka minut – szybki start pokazuje każdy krok.