Bu makalede sizinle symfony nin dizin yapısından bahsetmeyi düşünüyorum. Symfony yi aktif olarak kullanmıyorum ama kısa zamanda symfony kullanmaya geçiş yapacağım. Bu makaleyi yazarken bir laravel kulalnıcısı olarak karşılaştırmalara yer vermeyi düşünüyorum. Web frameworkler genel itibariyle birbirleriyle benzerlik içerisindedirler, symfony de öyle sadece diğerlerine kıyasla symfony nin yapısınının biraz farklı olduğunu görmüş oldum. Bu değişiklık geliştirmeye başladığınız projenin ileri evrelerindeki müdehaleler ve yeni geliştirmeler için esneklik kazandıran farklılıklardır. Aynı zamanda öğrenmek açısından öteki frameworklere kıyasla biraz daha fazla vakit ayırmanız gerekir sadece öğrenme mevzusunda ilerledikçe öğrenme ivmelenecektir.

Ben direkt symfony öğrenilmesi taraftarı değilim çünkü öğrenilmesi zor olmasından ziyade detaylı bulunduğunu düşünüyorum şu demek oluyor ki güçlük benzer biçimde görünen kısım detaylı olmasıyla alaklı bir durum. Örneğin rota yapısı için route.Yml dosyasını, annotations yapısını, xml yada php dosyası kullanabilirsiniz. Bu projenin yapısı yada geleneğinize gore farklı yöntemler kullanabileceğiniz anlamına gelir. Onun haricinde bundle yapısı dışında öteki frameworklerden farklı bişey yok. Symfony nin yapısını anlayarak kullanabilmek için öncelikle birazcık daha kolay bir framwork ile başlayabilirsiniz. Bu mevzuda laravel framework ü tavsiye ederim. Laravel öğrenilmesi rahat bir frameworkdür. Rota yapısı, orm kullanımı mvc ilişkisi, http request yapısı(GET, POST vs.), validasyonlar, uygulamanın geçit noktası(middleware) yani kontrol noktası, template engine vs. Daha sıradan bir framework ile bu yapıların işleyişine aşina olduktan sonra symfony öğrenmek çok daha kolaylaşacaktır çünkü symfony nin yapısındaki seçeneklerin fazla olmasının bir zorunluluk yahut karmaşa değil esneklik olduğunu farkedeceksiniz.

Web frameworkler kısa zamanda proje geliştirebilmenize olanak sağlarken kod yenidenının da önüne geçer. Gene MVC yapısı kullandıklarından projenin son kullanıcıya işlenmiş veriyi gösterdiğiniz kısmı(View), logic kısım(Controller), veritabanı ilişkileri ve varlıklar(çoğunlukla veritabanı tablo yapısı doğrusu Model) kısmından oluşurlar. Bazı dillerde model kısmı entitiy olarak da söyleniş edilebilmektedir. Bu saydığım yapı yalnız back-end dillerde değil örneğin angularjs şeklinde front-end işleri görmek adına kullandığımız yapılarda da mevcuttur. Peki bu frameworkleri birbirinden ayıran özellikler nelerdir ?

Front-end ve Back-end yapıları üzerinde çalışmış biri olarak gördüğüm değişiklıkları sıralamam gerekirse;

* Framework kullanım alanı(Symfony, Laravel => Web framework, Slim => API framwork)
* Desteklediği varlık yapısı (ORM)
* Komünite (topluluk)
* Öğrenme kolaylığı ve dokümantasyon teferruatı, ulaşılabilirliği
* Frameworkün kararlılığı versiyon desteklenme süresi (lts)
* Esneklik ve takım çalışmasına uygunluk (örn: Laravel migrationlar)
* Paket desteği (bağlarımlılıklar)

Farklı web frameworkleri incelediğinizde dizin yapılarının farklı oluğunu görürsünüz. Örneğin laravelin 4.X ve 5.X için bile dizin yapısı hepsiyle değişmiş durumdadır. Bununla beraber bazı frameworkler birbirlerinin paketlerini dahi kullanırlar. Gene laravelin yapısına bakmış olduğunuzda birçok paketi symfoy ye aittir ama tamamen farklı yapıda frameworklerdir.

Bunun yanında symfony framework un dizin yapısına bakalım;

Symfony Dizin Yapısı

app/
Uygulama ayar dosyaları, rota tanımları, template yapısı, çeviri dosyaları.

bin/
Çalıştırılabilir dosyalar (örn: bin/console)

src/
Php dosyaları, logic kısım yani iş mantığı(Controller dosyaları)

tests/
Test yapısı (örn: Unit tests).

var/
Genellikle otomatik oluşturulan tampon dosyalar (cache, loglar, vb.).

vendor/
Uygulamanın alet çantası olan paketler. Framework ilk kurduğunuzda varsayılan olarak birçok paket yüklenmiş halde gelir ancak sonradan ihtiyacınıza göre yeni paketler bu dizin altına yüklenir ve composer ile yönetilir.

web/
Web dizini, statik dosyalar (css, javascript, resim dosyaları vb.)

Symfony Bundle Yapısı

Bu kısım symfony nin en güçlü yanıdır diyebiliriz. Bundle aslında uygulamanıza gerçek anlamda modüler bir yapı kazanmıştırrır ve her bundle aslen ayrı bir modül olarak uygulamanıza esneklik kazanmıştırrır. Symfony ile yazdığınız bir bundle için tüm bileşenleri (view, controller, statik dosylar) bir arada biriktirerek başka projeler için de kullanabilirsiniz. Örneğin kapsamlı bir proje için (website, forum, blog) şeklinde projeyi parçalara ayırarak geliştirebilirsiniz. Bu projede kulandığınız forum yapısını ayrı bir bundle olarak geliştirmeniz hem bu proje için daha yönetilebilir hale gelirken bununla beraber tekrar (başka bir projede) kullanılabilir bir modül geliştirmiş oluyoruz.

Bu makalede terimlerde ya da kavramların kullanımında eleştirileriniz olması halinde yazabilirsiniz, ustalaşmış bir symfony geliştiricisi değilim kullandıkça karşılaştırmalarımdan, değerlendirmelerimden edindiğim bilgiler ışığında anlatmak adına paylaşımda bulunmak istedim. Umarım faydalı olmuştur.

tugay mert eyüpoğlu