Dlaczego hejce SMARTY?

Czym jest PHP Smarty? Dla osób które jeszcze tego nie wiedzą treściwy komentarz – czymś na co nie warto marnować czasu. Nasuwa się teraz pytanie, dlaczego? Czemu tak surowo podchodzę do tak wspaniałego silnika! Długo zastanawiałem się czy w ogóle poruszać tę kwestię, ze względu na wiekowość samego rozwiązania.  Postaram się wytłumaczyć wszystkie moje obiekcje względem tego tworu.

Czym w ogóle jest PHP Smarty? Jest to silnik generacji szablonów, który ma zadanie oddzielić nam warstwę prezentacji aplikacji od kontrolerów i modeli. Samo SMARTY jest dodatkiem do PHP a nie jego zamiennikiem, więc możemy stosować zwykłego pehapca i html’a zaraz koło smarty (jak by się nam w życiu nudziło). Smarty realizuje założenia wzorca MVC które na chwilą obecną wspiera każdy normalny framework, ot chociażby przestarzały już Zend Framework w wersji 1.12.

Co jest fajnego w Smarty? Na pewno składnia samego języka. Jest ona przyjemna dla oka oraz prosta pod warunkiem że zna się możliwości danych funkcji. Niektóre osoby może zmylić zapis

{$title|escape|lower}

który nie jest niczym innym niż zapisem:

<?php echo strtolower(htmlspecialchars($title,ENT_QUOTES,UTF−8)); ?>

No dobra, kod wygląda fajniej w smarty, jest również mniejszy itd. No ale zakładam że jesteś programistą, więc co za problem strzelić sobie odpowiednią funkcję typu

<? esc_low($text) ?>

która będzie równie wydajna (o ile nie wydajniejsza) i zmniejszy nam sam zapis w widoku. Nie musisz do tego wszystkiego uczyć się kolejnego elementu, tylko jesteś samowystarczalny i zyskujesz pełną możliwość zarządzania swoimi funkcjami.

Teraz kontr argument który właśnie przyszedł mi do głowy względem tego co napisałem. Programistą nie każdy jest. Sztab front-developerów nie musi biegle poruszać się w PHP i nie napiszą sobie funkcji która coś im tam przemodeluje, a niedopuszczalnie jest również wpuszczenie tego pazia w mainstreamowych kapciach do pokoju programistów bo mu się krzaczki wyświetlają. Dlatego też w dużych grupach developerskich PHP Smarty jest silnikiem który znajdzie rację bytu i rozwiąże wiele problemów. Tylko pojawia się pytanie czy na pewno powinno się użyć akurat tego silnika. Poniżej listing przykładowego szablonu wykonanego przy pomocy Smarty. Idzie zauważyć że jest w nim zastosowana logika PHP, więc czemu nie nauczyć front-developera kilku loopów i echo?

<table border="0" width="300">
  <tr>
    <th colspan="2" bgcolor="#d1d1d1">
      Guestbook Entries (<a href="{$SCRIPT_NAME}?action=add">add</a>)</th>
  </tr>
  {foreach from=$data item="entry"}
    <tr bgcolor="{cycle values="#dedede,#eeeeee" advance=false}">
      <td>{$entry.Name|escape}</td>       
    <td align="right">
      {$entry.EntryDate|date_format:"%e %b, %Y %H:%M:%S"}</td>       
    </tr>
    <tr>
      <td colspan="2" bgcolor="{cycle values="#dedede,#eeeeee"}">
        {$entry.Comment|escape}</td>
    </tr>
    {foreachelse}
      <tr>
        <td colspan="2">No records</td>
      </tr>
  {/foreach}
</table>

Ważnym elementem który należy wziąć pod uwagę w ocenie tego silnika są możliwości dzisiejszych frameworków. Zend ma swoje Zend_View, które według mnie posiada duże możliwości (w wersji ZF2 urzekło mnie to jeszcze bardziej), więc po co dublować funkcjonalność i implementować dodatkowo Smarty. W Symfony posiadamy zaimplementowany Twig, dlatego dodawanie do tego Smarty również mija się z celem. Gdzie może przydać się nam Smarty? Bardzo prawdopodobne że ewentualnie użyjesz smarty w pisanym przez siebie frameworku, tylko pytanie czy nie lepiej nauczyć się Twig’a skoro jest używany w Symfony i mieć już jakiegoś dodatkowego skilla przy ewentualnym podaniu o pracę? Poniżej przykładowy szablon zapisany przy pomocy Twig’a:

<!DOCTYPE html>
<html>
    <head>
        <title>My Webpage</title>
    </head>
    <body>
        <ul id="navigation">
        {% for item in navigation %}
            <li><a href="{{ item.href }}">{{ item.caption }}</a></li>
        {% endfor %}
        </ul>

        <h1>My Webpage</h1>
        {{ a_variable }}
    </body>
</html>

Łatwo zauważyć że nie różni się aż tak od Smarty, jednak w celu dokładnego ocenienia wad i zalet musiałbyś się czytelniku dokładnie wgryźć w dokumentację, czego za Ciebie nie zrobię. Dopiero wtedy zauważył byś mankamenty każdego rozwiązania i oceniłbyś które bardziej wpasowuje się w Twój tok logicznego rozumowania. Założenie tego artykułu to hejt na Smarty który rykoszetem pójdzie na inne systemy templatów, starając Ci się uświadomić że jest to wymyślona i spreparowana przez kogoś patologia zdobywająca nowych zwolenników.

Czy warto nauczyć się Smarty? Jeżeli programujesz sklepy www i używasz silnika PrestaShop to na pewno przyda Ci się ta wiedza, w pozostałych przypadkach jeżeli już musisz to lepiej zacznij się uczyć Twig’a lub Laravel.

Jakie w mojej ocenie jakie są jeszcze wady i zalety tego rozwiązania?

  • Podczas zwykłej pracy developera Smarty działa wolno, bardzo wolno. Układasz elementy na ekranie i czekasz. Idziesz zrobić kawę i wreszcie możesz spojrzeć na efekty zmiany układu w połączeniu z CSS’ami. Dochodzisz do wniosku że to nie to i bajka zaczyna się od nowa. Jak temu zaradzisz? Dołożyć RAM’u do serwera – ale nie każdy może. Dodatkowo, czy nie lepiej przeznaczyć na coś innego te zasoby?
  • Sam silnik wydany jest na licencji LGPL z dopuszczonym użytkiem komercyjnym, więc możesz używać go do woli w każdym projekcie.
  • Wspomaga pełne zachowanie wzorca MVC w dużych projektach, gdzie programiści idąc na skróty dają elementy kontrolerów czy też nawet modeli w widokach (byłem naocznym świadkiem takich praktyk i cisnęły mi się na usta słowa ‚KILL HIM’. )
  • Nie ma żadnych realnych szans na obsłużenie wzorców MVVM i MVW.
  • Jest już przestarzały. Niestety nie znam żadnego silnika który bez gruntownej przebudowy i zmiany koncepcji działania działał by tyle co Smarty (ponad 11 lat).
  • Nie ufam projektom które nie mają swojego źródła na GitHubie oraz podczas przejścia z wersji 2 na 3 wymagane jest dodanie kilku linijek.
  • Posiada naprawdę bogatą dokumentację i niezłe wsparcie społeczności.
  • Duża ilość dodatków napisanych przez społeczność.

Reasumując. Uważam że Smarty jest stare, dojrzałe i dopracowane ale jednak stare. Stosując je w dużych projektach, ze względu na brak elastyczności rozwiązania, możemy narazić się na efekt zablokowanych drzwi które należało by wyłamać taranem. Sam silnik nie sprawdzi się w modelach MVVM i MVW – a te w mojej ocenie są przyszłością aplikacji w przeglądarkach. Jest to silnik który wymyśliły osoby nękane przez front-developerów. Tutaj pytanie do Ciebie. Czy Twój projekt będzie miał system szablonów który zaczniesz udostępniać osobom trzecim i miały by one czelność zawracać Ci głowę więcej niż 15 min dziennie?

Kasztelan Paweł

Programista samouk, zakochany w ZF i Laravel, szerzący opinię że PHP + JS + HTML + CSS to są języki w których może zostać stworzona aplikacja równie dobra, a nawet lepsza od twardego klienta.