customizing_instant_code_generation_illu

PHP ‘de Template Engine Mimarisi Üzerine

Template engine ler modern yazılım geliştirme kültürünün bir parçası haline gelmiş durumda.Bu gerekli bir şey mi değil mi bu konuya daha sonraki yazılarımda değinmeye çalışacağım. PHP dünyasında çok fazla template engine var(Smarty,PhpTal vsvs…). Kendi standartlarında belirledikleri bir yazım kuralı ile kodlanan bu templateler genelde ilk çağrı anında compile edilir, sonraki bütün işlemler compile edilmiş o […]

Template engine ler modern yazılım geliştirme kültürünün bir parçası haline gelmiş durumda.Bu gerekli bir şey mi değil mi bu konuya daha sonraki yazılarımda değinmeye çalışacağım.

PHP dünyasında çok fazla template engine var(Smarty,PhpTal vsvs…). Kendi standartlarında belirledikleri bir yazım kuralı ile kodlanan bu templateler genelde ilk çağrı anında compile edilir, sonraki bütün işlemler compile edilmiş o template üzerinden yürür.

Bir template engine de olması gereken en büyük özellik inheritance yapısının olmasıdır.Smarty den örnek vereceğim.Mesela 2 sürümlerinde template inheritance yokken Smarty 3 de bu özellik mevcut.Bu sayede istenilen tüm bölümleri bloklara bölerek hem daha rahat, hemde çok daha düzenli html çıktıları üretebiliyoruz.

Kısa bir kod örneği ile açıklamaya çalışayım :
Öncelikle tüm sitemizde görünecek işte header, footer vb şeyleri barındıran bir ana template hazırlıyoruz.Buna base.tpl diyelim :

<html>
    <head>
        <title></title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        {block name="assignValues"}{/block}
        {block name="css"}{/block}
        {block name="javascript"}{/block}
    </head>
    <body>
        {block name="content"}
        <div>Varsayılan içerik...</div>
        {/block}
        {block name="footer"}{/block}
    </body>
</html>

Şimdi oluşturulan bu şablonda block şeklinde tanımlanan yerler kod bloğunu temsil eder ve u template i miras alan her template bu blokları ezmek suretiyle yeni değerlerini yazar.

Bu base tpl i miras alan templateimiz de aşağıdaki gibi olsun :

{extends file="base.tpl"}
{block name="assignValues"}{/block}

{block name="css"}
<!-- css ler buraya -->
{/block}

{block name="javascript"}
<!-- Javascript ler buraya -->
{/block}

{block name="content"}
Hello World
{/block}

{block name="footer"}{/block}

Bu noktada javascript bloğu için yaptığınız tanımlamalar javascript bloğuna css için yaptıklarınız css bloğuna set edilecektir.Bu sayede tek bir template ile bütün templateleri kontrol edebilirsiniz.

Bu konu hakkında değinmek istediğim bir başka konu template engine performansı.Diyelim ki çok büyük bir projede bu template engine i kullandınız.Template compile süresi 0.7 saniye gibi birşey ve çok yoğun bir trafiğe sahipsiniz.0.7 saniyede yani siz template i compile edene kadar geçen sürede o sayfaya bir sürü istek geliyor ve template tekrar tekrar compile edilmeye çalışılıyor.Böyle bir durumda sistem yükünden dolayı siteniz yanıt veremez hale gelecektir.

Böyle bir sorunu aşmanın en güzel yolu : Bu templateleri yayına çıkarmadan önce toplu olarak compile etmek ve compile edilen templatelerin tamamını production a rsync ile göndermek güzel bir çözüm olur.
Zira böyle bir durumda templatelerin compile edilmiş hali gönderildiği için production sunucularınızda bir compile işlemi yapılmaz.Ayrıca ufak scriptler ile pre-production da yapılan compile işleminde bir hata olup olmaığını kontrol edip.Hata durumunda sürümü tamamen iptal edip hataların da önüne geçebilirsiniz.Smarty de tüm templateleri derleme işi için şu linkten faydalanabilirsiniz : http://www.smarty.net/docs/en/api.compile.all.templates.tpl