YAML Dosya Standartları

Er ya da geç, her Drupal projesinde YAML yazmak gerekiyor — modül info dosyaları, route'lar, servisler, kütüphaneler, konfigürasyon. YAML hoşgörülü görünür ama girinti kuralları hiç de öyle değil; tek bir yanlış konumlanmış boşluk, Drupal'ın bir dosyayı hiç ayrıştıramamasına yetiyor.

1. Girintileme

YAML, girinti seviyesi başına 2 boşluk kullanır, asla tab değil — bir YAML dosyasındaki tab karakteri, gerçekleşmeyi bekleyen bir parse hatasıdır ve Drupal'ın bu hata mesajı nadiren gerçek satırı işaret eder.

# ❌ Yanlış: girinti yok, iç içe yapı ayrıştırılamıyor.
product_import.settings:
path: '/admin/config/product-import'
defaults:
_title: 'Product Import'

# ✅ Doğru: 2 boşluklu girinti iç içe yapıyı gösteriyor.
product_import.settings:
path: '/admin/config/product-import'
defaults:
_title: 'Product Import'

2. Sık Karşılaşılan YAML Dosyaları

Neredeyse her modülde karşınıza birkaç YAML dosya türü çıkar: .info.yml modülün kendisini tanımlar, .routing.yml route'larını, .services.yml servislerini, .libraries.yml CSS/JS varlıklarını, .permissions.yml de izinlerini. Her biri aynı 2 boşluklu girinti kuralını izler ve her birinin kendi iyi dokümante edilmiş üst seviye yapısı vardır.

name: 'Product Import'
type: module
description: 'Imports products from the external catalog API.'
package: Custom
core_version_requirement: ^10 || ^11
dependencies:
- drupal:node

3. Route Tanımları

Bir route ismi, her şey gibi modülün machine name'iyle prefix'lenir. _controller, isteği işleyen class ve method'u gösterir; _title sayfa başlığını belirler; requirements ise kimin oraya ulaşabileceğini kontrol eder.

product_import.status_page:
path: '/admin/reports/product-import'
defaults:
_controller: '\Drupal\product_import\Controller\ImportController::status'
_title: 'Import status'
requirements:
_permission: 'administer product import'

4. Servis Tanımları

Servis YAML dosyaları, mimari bölümünde ele alınan kalıbı izler: namespace'lenmis bir servis ID'si, örneklediği class ve başında @ olan başka servis ID'leri şeklindeki constructor argümanları. Bir servis tanımındaki boolean değerler — shared: false gibi — PHP'de kullanılan TRUE/FALSE'un aksine küçük harfle yazılır.

services:
product_import.importer:
class: Drupal\product_import\ProductImporter
arguments: ['@logger.factory', '@http_client']

5. Config Schema

Konfigürasyon barındıran her modül — örneğin \Drupal::configFactory()'ye dayanan bir ayarlar formu — config/schema/ altında, konfigürasyonun içerebileceği her anahtarın tipini tanımlayan bir schema dosyasına ihtiyaç duyar. Bunu atlamak ilk bakışta hiçbir şeyi belirgin şekilde bozmaz, ama konfigürasyon çevirisini, validasyonu ve config import/export akışını sessizce bozar.

product_import.settings:
type: config_object
label: 'Product Import settings'
mapping:
api_endpoint:
type: string
label: 'API endpoint URL'
batch_size:
type: integer
label: 'Batch size'

6. Tırnak Kullanımı ve Boolean'lar

Çoğu değer için tırnaksız düz bir string yeterlidir, ama aksi halde bir sayı, bir boolean olarak ayrıştırılabilecek ya da özel bir karakterle başlayan her şey, YAML'ın onu yanlış okumasını engellemek için tek tırnak içine alınır. Çift tırnak ise escape dizilerine ihtiyaç duyan string'ler için ayrılmıştır.

# ❌ Yanlış: YAML'ın yanlış yorumlayacağı tırnaksız değerler.
version: 2.0
enabled: yes
path: /admin/config

# ✅ Doğru: gerçekten önemli olan yerde tırnak kullanılmış.
version: '2.0'
enabled: true
path: '/admin/config'

Son güncelleme: 21.09.2026 09:24