Konu Başlıkları
Yükleniyor...

Symfony Framework: PHP Projelerinde Ne Kazandırır, Maliyeti Nedir

PHP'de Symfony Kullanmak: Bileşenler, LTS Desteği ve Esnekliğin Bedeli

Symfony'yi diğer PHP framework'lerinden ayıran şey benchmark tablosundaki sırası değil, yazdığınız uygulamanın beş yıl sonra hâlâ güncellenebilir olması. Bunu sağlayan iki şey var: tek başına kullanılabilen bileşenler ve yazılı bir söze bağlanmış sürüm takvimi. İkisinin de bir bedeli var, o bedel de esneklikle övünen tanıtım metinlerinde nedense hiç geçmiyor.

Önce framework değil, bileşen kümesi

Symfony 2005'te SensioLabs bünyesinde doğdu ve bugün asıl yayılma alanı kendi adıyla kurulan projeler değil. Drupal, PrestaShop, hatta Laravel, çekirdeğinde Symfony bileşenleri taşıyor. Yani Symfony yazmadan Symfony kullanıyor olabilirsiniz.

Bunun pratik karşılığı şu: framework'ün tamamını almak zorunda değilsiniz. Bir CLI aracına argüman ayrıştırma lazımsa composer require symfony/console yeter, kernel de yapılandırma dizini de gelmez. Eski bir prosedürel projeye HTTP istemcisi eklemek istiyorsanız symfony/http-client tek başına çalışır. Bileşenlerin çoğunun tek bağımlılığı kendi contracts paketidir.

Kaynakların birçoğu hâlâ "15 yıllık geçmiş" diye yazıyor. 2005'ten bu yana 20 yılı geçti; o cümle bir yerlerden kopyalanıp güncellenmeden dolaşıyor.

Sürüm takvimi: üç yıllık destek herkes için değil

Symfony hakkında en sık tekrarlanan yanlış bilgi bu. "Her major sürüm 3 yıl desteklenir" cümlesi doğru değil. Takvim iki ayrı rejim işletir:

Sürüm tipiHata düzeltmesiGüvenlik yaması
Standart minor (7.1, 7.2, 7.3)8 ay14 ay
LTS (x.4, örn. 6.4)3 yıl4 yıl

Minor sürümler mayıs ve kasımda çıkar. Yani 7.1'e kurulum yapıp iki yıl dokunmazsanız desteksiz bir sürümde oturuyorsunuz demektir. Uzun ömürlü kurumsal projede tek makul seçim x.4 sürümleri, yani LTS hattı. Sürekli geliştirilen ve altı ayda bir güncellenebilen bir üründe ise standart hatta kalmak mantıklı, çünkü deprecation'lar tek tek ve az sayıda gelir; LTS'ten LTS'e atlarken üç yılın birikmiş uyarısını tek seferde yemek zorunda kalırsınız.

Esnekliğin faturası

Bağımlılık enjeksiyonu ve olay dağıtıcısı sayesinde neredeyse her davranışı değiştirebilirsiniz, çekirdek dahil. Doğru, ama eksik anlatılıyor.

Geriye dönük uyumluluk sözü kamuya açık API'yi kapsar. Bir servisi #[AsDecorator] ile sarmalayıp arayüzünü kullanıyorsanız güvendesiniz. Bir listener'ı önceliğe göre başka bir listener'ın önüne sokuşturduysanız, ya da @internal işaretli bir sınıftan miras aldıysanız, bir sonraki minor sürümde sessizce kırılabilirsiniz ve bu, sözün ihlali sayılmaz. Kural basit: contracts arayüzlerine yaslan, somut sınıfa yaslanma. Override etmek yerine decorate et.

Bundle yazmak da aynı hesaba tabi. Üç servis ve bir yapılandırma ağacı için ayrı bundle çıkarmak, projeyi bölmek yerine sadece bakım yükünü ikiye katlar. Bundle'ı gerçekten birden fazla projede kullanacaksanız yazın.

Geliştirme sırasında işi kolaylaştıran şeyler

Profiler ve web debug toolbar, Symfony'nin en çok konuşulan özellikleri. Toolbar'ın sağladığı asıl fayda hata ayıklama değil, N+1 sorgusunu üretime çıkmadan yakalatması: sayfa altındaki sorgu sayacı 300 gösteriyorsa bir yerde döngü içinde lazy loading yapıyorsunuzdur.

Profiler'ın maliyeti de var. Her isteği var/cache/dev/profiler altına yazar; birkaç bin istek sonra dizin gigabyte'lara çıkar ve dosya sistemi yavaşlar. Ara sıra silmek gerekir, üretimde ise hiç açılmaz.

Yeni projeye başlamak için:

symfony new --webapp benim-proje

Demo uygulamayı görmek isteyenler --demo bayrağını kullanabilir. Çıkan iskelet Doctrine, Twig, form ve güvenlik paketlerini hazır getirir, ama gerçek projede ilk iş bunlardan kullanmayacaklarınızı kaldırmaktır.

Ne zaman Symfony, ne zaman değil

Symfony'nin bedeli öğrenme eğrisi ve kurulum ağırlığı. Karşılığında aldığınız şey, ekibe yeni katılan birinin dosya yapısını sormadan bulabilmesi ve iki yıl sonra kimsenin "burada bu konfigürasyon nereden geliyor" diye saatlerce aramaması.

Uzun ömürlü, birden fazla kişinin dokunacağı, veri modeli büyüyecek işlerde bu takas fazlasıyla kârlı. Tek uç noktalı bir webhook alıcısı ya da üç ay sonra çöpe gidecek bir prototip içinse tam paket ağır kalır; o durumda routing ve http-foundation bileşenlerini alıp elli satırda bitirmek daha dürüst bir çözüm. Symfony'nin güzelliği zaten bu ikisi arasında seçim yapmanıza izin vermesi.