yazı uzun olsada okumanızı tavsiye ediyorum
Framework’lere girişim
Framework’leri uzun zamandır çok yakından incelesem de, hiçbirisi içime sinmedi. Çoğunlukla da geleneksel çözüm üretme yerine çok katı yapısal kuralları olan araçları öğrenmeye yeterince zamanım olmadığı görüşünde olduğumdan böyle hissettim. Bu belki de şimdiye kadar web uygulamaları konusundaki yeni araç / teknoloji / yöntem ‘i uygularken karşılaştığım en acılı`learning curve` safhasını öngördüğümden böyle oldu. Fakat makaleleri okudukça, gerçekten ne kadar hızlı uygulama geliştirildiğine, ne çok ‘tekerlek icat’ ettiğime tanık oldum. Dolayısıyla öğrenme zamanı masrafını riske edip, bir anlamda
kırmızı hapı içip, frameworkler hakkında kendi tecrübelerimi oluşturmaya karar verdim.
İlk soru, tabii ki hangi framework sorusu oldu. Hepsi hakkında gördüğüm birbirlerinden farklılık yaratan özet bilgiler, şu şekildeydi;
- Code Igniter: Hızlı, esnek, kolay, öğrenme süreci hızlı
- Zend FrameWork: Uzman, enterprise uygulamaları kaldırabilecek - acılı öğrenim süreci, kimine göre en hızlısı, kimine göre en yavaşı, ne yaptığını bilen insanlar tarafından geliştirilmiş
- Symfony: Uzman, enterprise uygulamaları kaldırabilecek, en çok özelliği barındıran
- cakePHP: En iyi MVC, en iyi Framework, en iyi Ruby on Rails PHP Kapısı, en çok automation (sihirli) fonksiyonu bulunduran, en kolay
Bunlar söylenirken, keşke mantıklı, açıklayıcı makaleler bulabilsem, fakat çoğu takım tutar gibi framework savunuyor. incelediklerimden sadece IBM objektif bakmış ve her framework’de (Code Igniter hariç) bootstrap, veritabanı bağlantısı, vb temel öğeleri kullandırarak birer uygulama örneği yapmış. Makaleye
buradan ulaşabilirsiniz.
Symfony - PHP’ye konser verdirmek
Genelde kararsız ve katı bir fikre sahip olmadığım zamanlarda ve konularda büyük araştırma bütçelerine sahip, teknoloji araştırırken iliğine kadar araştırıp geçiş kararı alan , User Interface konsunda büyük özen sahipi internet hizmeti dünyasının başlıca şirketlerinin kararlarını hep kayde alarak/esinlenerek kendime yön vermişimdir. Yahoo’nun PHP’ye geçişi, dünyanın en büyük ilişkisel veritabanı sahibi olduğu söylenen friendster’in ve facebook’un MySQL tercih etmeleri gibi, framework seçiminde de yakın zamanda Yahoo’nun Symfony seçimine yöneldim. Bu yüzden her ne kadar IBM’in makalesinden (gördüğüm tek elle tutulur makale) cakePHP sonucu çıksa da ilk seçimim Symfony oldu.
Öncelikle ne kadar iyi belgelendigi (documentation) , API Referance’a sahip olduguna baktım.
ORM’siz var olamayan Symfony beni kısa sürede kullanmayı pek sevmediğim şema dosyalarına bulaştırdı. Hakkında pek çok şikayeti bulunan
Propel kullanıyordu. Bir süre
YAML formatlı bu sıkıcı şema dosyalarıyla uğraştıktan ve sonunda bootstrape benzeyen birşey çıkardıktan sonra, propel’in ne kadar yavaş olduğunu tecrübe ettim.
Sonuç olarak bu kısa deneyimde hızlıca symfony’nin hem uygulama geliştirme hızı açısından hem de kod performansı açısından, spaghetti koddan benim gözümde daha düzgün görünür olmadığına inandım. Üzerine bir de propel’in yavaşlığı gelince, iyice bozdu hevesimi. Akabinde propel’e alternatif Symfony’nin doctrine ile çalışmaslarını gördüm. (doctrine, propelden sonra baya övgü alıyor). Fakat doctrine ancak Symfony 1.1 Beta ile çalışıyor. Kısacası ‘Ohooo daha beta’ mazareti/bahanesiyle beni zart zurt şema kullanmaya zorlayacak bir framework’ü istemedim, ve caydım.
cakePHP ile baklava açalım, muhabbet edelim
Makale sonucundan cakePHP’yi ilk deneme tahtam olarak seçerek, IBM’inkinden daha kapsamlı ve proje ihtiyaçlarına göre ayarlanmış database wrapperını, view’unu, MVC yapısını uygulamaya başladım. Modeline az çok ORM’yi de katmış bir model yapısıyla karşılaştım, beni oldukça sevindirdi. hasMany, belongsTo, vb tanımlar foreign key’ini kodda tanımlayabileceğin ve veritabanı yapısını iş akışıyla birlikte tanımlandığı, Framework’un bu yapıyı esnek bir biçimde kodun farklı yerlerinde (MVC gereği controllerda) manipüle etmeye izin veren bir yapısı vardı, oldukça kanım ısındı. View’unu, layoutuyla, elementleriyle zaten şiir gibi oluşturdum. Controller’dan zaten çok birşey beklemiyordum, beklentilerimin tamamını karşıladı.
Sihirli fonksiyonlarının SQL bilgisini, HTML hatta JavaScript bilgisini bile (automated ajax kullanmakta) neredeyse gereksiz kılması beni, bu framework’un ‘cakePHP bilin, herşeyi bilin’ tarzında bir görüşü sahiplendiği fikrini oluşturdu. Bu fikir git gide yüzümü ekşitmeme neden oldu; ne zaman manual’ı açsam, bana güzel örneklerle mantıklı cevaplar vereceğene bütün sevimliliğini takınıp ‘canım bitanem bunu cakePHP yolundan yap, bak ne güzel sihirli sihirli geçinelim’ diye bitakım direktifler veriyordu. Bu duruma bozulsam da en azından sonuç alabildiğim için devam ettim. Çalışmama devam ederken router’ının ve MVC yapısının sihir fonksiyonlarıyla olmayacağına ve tanımlamaların yetersizliğini gördüm. Elimdeki sorunun çözümlerinin cakePHP core class’larının extend etmemle başarabileceğim görüşünü aldım, extend ettim, artık commentlerde manualdeki gibi pek de sevimli olmayan ‘Bunu böyle yap! Aman buna dokunma dağılır!’ gibi bir havayla karşılaştım, o vakit ayrılık kararımı verdim.
Son fikrim, cakePHP’de hızla kişisel bir blog yapılır, hızla bir forum yapılır, ama asla CRM, karışık hiyerarşi / iş tanımı barındıran uygulamalar sıkıntı yaşamadan, binbir takla atmadan yapılamaz. Daha sonra merakımdan, acaba cakePHP mi birşeyler atlamış yoksa orjini Rails de mi böyle diye araştırdım; evet, cakePHP iyisiyle kötüsüyle babasına çekmiş bir framework. Ayrıca binbir helper da kullanmak istemiyorum. Ayrıca PHP’nin JavaScript’ten ayrılmadığı bir framework view’u controller’dan ve model’den ne kadar uzak tutabildiğini iyi ki görmedim.
Code Igniter - Sexy kodlar
İki framework’ün yorucu yapısından bezmiş olarak araştırmaya devam ettim. Özellikle Manual’ının çok övüldüğü, öğrenmesi hızlı, cakePHP’nin sihirbazlığından gına gelmiş ve Zend Framework / Symfony ağırlığında olmayan geliştiricilere hitap eden Code Igniter’ın ilgimi çekmesi zor olmadı. Öncelikle gerçekten cakePHP ve Symfony tecrübesinden sonra çok rahatladım, onlarda yarattığım örnek uygulama çok hızlıca çıktı. cakePHP’nin hasMany, belongsTo tanimlamalari, findKullanici vb sihirbazlari yoktu ama zaten SQL bilme zorunluluğu olan web geliştiricilerinin olmazsa olmazları içinde de yoktu. Kısacası herşey çok kolay, hızlı çıktı. Fakat genel framework özellikleri biraz yetersiz gelmeye başladı. Örneğin, keşke cakePHP’nin view’u bunda olsaydı dedim. Biraz araştırma yaptım, ortalıkta 1-2 layout ve element denemesi olsa da cakePHP kolaylığında ve hiyerarşisinde çalışmıyordu fakat farketmediğim bir özelliği de bu makaleler sayesinde keşfettim, CI ‘da işleyişin tamamını kolayca, core’a dokunmadan değiştirmen için hook kolaylığını getirmişler. -Edit:
Code Igniter’a eklediğim Layout özelliğine buradan erişebilirsiniz- 3 saatte CI’ya cakePHP’nin bütün layout ve html element (renderElement) view’unu implement etmiş buldum kendimi. Gelgelelim, işimiz biraz karmaşıklaşıp, klasik frameworkünkilere uymayacak routerlar yazmaya gelince gene CI yetersiz kaldı.
Herşey çok basitti fakat yapılacak iş biraz karmaşıklaşınca, tamamı yetersiz kalıyordu. Örneğin route belirlemek çok kolay, ama karmaşık route tanımları yazmaya gelince çok geçmeden, işin çözümünün bir MY_Router yazmaktan geçtiği belli oldu. Forumlarda, tecrübeli kullanıcılar ise uğraşmayın canım, yazın mod_rewrite ile demekten başka pek yardımları olamadı, sonuçta öbür seçeneğin özel kod olduğu belli. Eh, routing’i PHP’nin bilmesi gerekmiyorsa, zaten bunu PHP ile yapıp performans düşürmenin alemi yokki diyip, bu durumları handle etmesi icin gene router’ı extend ettim. Hiyerarşi oluştururken ACL (Access Control List) kütüphanesini kullanmam gerekti, fakat ACL’i iyi düşünülmemiş, ARO (Access Request Object) ‘larda gruplama / hiyerarşi sözkonusu değildi ve sadece CRUD (create read update delete) destekliydi. Tamam dedim, gittim kendi ACL’imi yazdım, herhangi bir kodda ACL ne kadar hızlı yazılırsa, o şekilde bir library yazdım. Ama buarada en azından benim projem için CI_Acl de çöpe gitti.
Sıra sitede multilang oluşturmaya geldi. Dil secimini sessiona veya cookieye atmayıp
Google dostu /en/firmalar/.. seklinde URL’ler yaratmaya geldi, tekrar routinge dalarken artık yüzüm gülmüyordu. Code Igniter’daki model classlarında $_POST ‘u gormemle (gözümden kaçmış), yok daha neler, artık manualde de böyle bir hata olmaz ki şeklinde mızmızlanmaya başladım. Düşünülmüşlük ve MVC yapısının sağlamlığı konusunda Symfony beş basardı.. Kendimi tekrar şemaların işkencesine, propele dönüş yapacağım düşüncesine alıştırmaya başladım.
Derken,
Zend Framework 1.5 betadan çıktığını duyurdu.
ZF’ye geçmeden, Code Igniter konusundaki son fikrim şu; eğer en azından MVC ‘ye az çok benzeyen, az çok kodun, bootstrap’i hazır bir framework arıyorsanız, budur. Esnekliği kullanıcının emeğine bağlı ama işleri usandırmadan yaptıran bir yapıya sahip olan Code Igniter kesinlikle küçük projelerde 1 numaralı seçimim olur.
Zend FrameWork - Usta’nın alet çantası
Symfony’yle yaşadığım eziyetten sonra, Symfony ile ismi birlikte anılan Zend Framework’ün içine girme fikri aslında başta çok uzaktı. IBM örneklerindeki uzun tanımlamalar, bootstrap’inin kalın olması, vb hep uzak geldi. Kafamda başlarken daha nasıl olsa Symfony’ye dönüş yapacağım düşüncesi vardı. Her işe başlarkenki gibi ilk başta dökümantasyonuna baktım. Bir devasa Developer’s Guide, bir de PHPDoc API buldum. Documentation cakePHP, Code Igniter diğerlerinin aksine ‘haydi hem eğlenelim, hem öğrenelim bak o kadar da zor değil’ yerine ‘Elinizdeki şu işe yarar, mantığı budur’ şeklinde ciddi ve tatmin edici bilgiler vardı. Yani soruları sizin sormanız gereken, dolayısıyla doğru soruları sormanız gereken bir dokümantasyon bu. Ortada diğerlerinin aksine bir başlangıç dersi yoktu nitekim FrameWork’ün bütün modülleri, teker teker açıklanmış durumdaydı. Birileri, elbette “herkesin her terimi ve yöntemi bilmesi beklenemez, neyin nerede olması gerektiğini herkes kestirmek zorunda değil; mutlaka yönlendirme olmalı” diyebilir; fakat bunun adı geliştirici dokümanı, diğerlerininki gibi ‘el kitabı’ değil. Özetle bana göre o ana kadar okuduğum dökümantasyonlardan en yüksek puanı alarak geçti.
Sıra ZF’ui projemde kullanarak uygulamaya geldi. Yapı modüler olduğu ve hiçbirşey öntanımlı/kısıtlayıcı olmadığı için ortada hazır bir bootstrap de yoktu. İlk iş, bir bootstrap dosyası yaratarak (genelde index.php de başlar, ve config/load phpleriyle devam eder), ZF’nin nelerini, hangi sırayla, hangi MVC yapısıyla, hangi routerla, hangi dizin yapısıyla kullanacağını belirlemekten ibaret oldu. Açıkçası en azından MVC’yi önden tanımladığını düşünüyordum fakat onu bile yapmadı. Bootstrapinizde front controller tanımlamadığınız sürece, MVC kullanmak durumunda bırakmıyordu, hatta bir parametreyle aynı bootstrapde hem MVC, hem spaghetti kullanabileceğim sözkonusuydu. Bootstrap’i oluşturmaya başladım, bu yaklaşık 1 haftamı aldı diyebilirim. Sırasıyla Front Controller’ı (MVC), Route’u (url rewrite), Locale’i (çoklu dil ve dillere özgü destek) , Autoload’u, Registry’si, Cache’i (ayrıca ZF’den değinmek için ) derken bootstrap bitti. Bootstrap oluştururken ZF ‘ye bağımlı kaldım fakat bitane extend’im, bu modül bana cevap vermeyecek dediğim birşey olmadı. Modüller gördüğüm en iyi düşünülmüş işlevlere sahipti. Olması gereken herşeyin frontend, backend’i vardı. Yani çağırılış işlevleri ayrı classlar, arkaplan çalışması ayrı classlar tarafından yürütülüyordu. Router’ı mod_rewrite’ın yapabildiği herşeyi destekliyor, bide üstüne bu da var diyordu. Örneğin Zend_Cache’i huzurunuza çağırdığınızda “sayfaları mı cache’liyeceksiniz, yoksa büyük array, fonksyion, object lerimi?” diye sormakla kalmıyor, ekliyordu “backend olarak dosyada mı saklamak istersiniz, yoksa veritabanında mı tutayım? İsterseniz memcache kullanarak memmory’de dursun jet hızıyla erişin.”
Kısacası ZF ile neyi nasıl yapacağım kafamda oturdu. Sunduğu araçların hepsi, her türlü kullanıma, her yola geliyor. Buna karşın geliştirme aşamasının en uzun ‘Learning Curve’ olarak anılan, öğrenme sürecine sahip, fakat umduğumun aksine sıkmadı, hatta core kodlarını incelerken programlama tekniklerinde de bana çok şey kattı. Önümde duran koskoca projede işlerimi nasıl hızlandıracağından, hemen her projemde sıkıntı çektiğim nereden başlayacağım sorusunu da bootstrap’i oluşturarak emin oldum. Herşeye rağmen ZF’yi sadece büyük projelerde kullanacağımı sanıyorum. Bu framework’ü sık kullanacağım iki framework’den biri olacağından, Code Igniter’ın yanında kategori olarak tanımlamaya karar verdim.
Son olarak
cakePHP’nin sihirbazlığını kimileri çok sevse de, ben ısınamadım. Code Igniter’ın esnekliği tamamen custom kod yazımının kolaylığından ve komplike tekniklerin kullanılmamasından geliyor. Zend Framework ise gerçekten iyi düşünülmüş bir araç. Çağırıldığında biraz yavaş geldiğinden, küçük, hızlıca bitirilmesi gereken projelerde kullanılmasının gereksiz vakit ve işgücü sorunu yaratacağını sanıyorum. ZF yol yordam bilenlerin taşıyabileceği ve ancak büyük işlerde çağırılması gereken bir araç.
alıntı :
Framework’lere başlarken « Gökçe’nin Web Güncesi (gwg)