Twig Standartları

Bir Twig şablonunun işi bilinçli olarak dar tutulur: zaten hazırlanmış veriyi alıp göstermek. Twig standartlarının neredeyse tamamı bu sınırın bulanıklaşmasını engellemek için var.

1. Mantığı Şablonun Dışında Tutun

Bir şablonun içine doğrudan PHP benzeri biraz mantık sıkıştırmak cazip gelebilir, ama bu mantık bir preprocess fonksiyonuna ait. Onu dışarı taşımak şablonu bir bakışta okunabilir tutar ve mantığın kendisini gerçekten unit test edilebilir bir şey haline getirir.

{# ❌ Yanlış: iş mantığı şablonun içinde satır arasında hesaplanıyor. #}
{% if node.getType() == 'article' and node.get('field_featured').value == 1 %}
<span class="badge">Featured</span>
{% endif %}

{# ✅ Doğru: bu karar preprocess fonksiyonunda zaten verildi. #}
{% if is_featured %}
<span class="badge">Featured</span>
{% endif %}

Bir şablon yine de basit sunumsal koşullar taşıyabilir — bir değerin boş olup olmadığı, iki class'tan hangisinin uygulanacağı — bu iş mantığı değil, sadece görüntüleme mantığıdır.

2. Çeviri

Kullanıcıya gösterilen her metin, sadece tek bir dilde yayınlanacak bir projede bile |t filtresi üzerinden Drupal'ın çeviri sistemine geçer — çünkü bunun ne zaman değişeceği hiç belli olmaz.

{# ❌ Yanlış: sabit metin, hiç çevrilmiyor. #}
Read more

{# ✅ Doğru: çeviri sistemi üzerinden geçiyor. #}
{{ 'Read more'|t }}

Dinamik bir değere ihtiyaç duyan çevrilebilir bir metin, string birleştirme yerine bir placeholder alır; böylece çevirinin kendisi birbirine yapıştırılmış parçalar yerine tutarlı, tek bir cümle olarak kalır.

{{ 'Welcome back, @name!'|t({'@name': username}) }}

3. Otomatik Escaping ve |raw

Twig çıktıyı otomatik olarak escape eder, bu yüzden |raw'a nadiren ihtiyaç duyulur — bir kullanıcıdan ya da editörden gelen herhangi bir şeyde ona başvurmak, bir temaya XSS açığının girme yollarından biridir.

{# ❌ Yanlış: kullanıcı içeriğinde |raw kullanmak XSS'e kapı açar. #}
{{ comment.body|raw }}

{# ✅ Doğru: Twig'in otomatik escaping'i işini yapsın. #}
{{ comment.body }}

|raw'ın gerçekten kullanılması gereken tek içerik türü, zaten güvenilir bir temizleme adımından geçmiş içeriktir — güvenli olarak işaretlenmiş bir render array, check_markup()'tan gelen çıktı gibi.

4. Boşluk Kontrolü

{%- ve -%} etiket varyantları çevredeki boşluğu siler; bu, inline elementler ya da <pre> blokları gibi rastgele boşluğa duyarlı markup üreten şablonlarda kulağa geldiğinden daha fazla önem taşır.

{%- for item in items -%}
<li>{{ item.label }}</li>
{%- endfor -%}

5. Attributes Nesnesi

Bir elementin class'ları ve diğer HTML attribute'ları, düz bir string olarak yazılmak yerine attributes nesnesi üzerinden oluşturulur; bu da başka modüllerin bir şablon override'ı yapmadan aynı elemente kendi class ve attribute'larını ekleyebilmesini sağlar.

{# ❌ Yanlış: sabit yazılmış bir class attribute'u. #}
<div class="card card--featured">

{# ✅ Doğru: attributes nesnesi üzerinden oluşturulmuş. #}
<div{{ attributes.addClass('card', 'card--featured') }}>

Son güncelleme: 21.09.2026 09:35