Silnik Szablonów PHP

UIEngine

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

Czym jest UIEngine?

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ć.

Sześć powodów, by wybrać UIEngine

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.

Automatyczne escapowanie

Wyjście {$var} jest domyślnie escapowane jako HTML. Kto chce surowego wyjścia, musi zażądać tego jawnie przez |raw – nigdy odwrotnie.

Dziedziczenie i includy

{extends}, {block}, {parent} i {include} do wielokrotnie używanych layoutów, a do tego {function} do własnych makr szablonów.

Piaskownica polityki bezpieczeństwa

Opcjonalne ograniczenia: dozwolone modyfikatory, widoczne stałe PHP, dodatkowe katalogi szablonów, blokada {eval}, {fetch} tylko z jawnym zezwoleniem.

Cache wyjścia

Skompilowane szablony są cache’owane, całe strony opcjonalnie przez display($tpl,$id,$lifetime) – dynamiczne fragmenty pozostają aktywne dzięki {nocache}.

Brak zależności

Czyste PHP 8.1+, własny autoloader PSR-4 do użycia bez Composera, ale działa równie dobrze z nim.

Tak to wygląda

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}

Bezpieczeństwo nie jest dodatkiem

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.

Gotowy, by zacząć?

Pierwsza strona zadziała w kilka minut – szybki start pokazuje każdy krok.