Symfony ‘de bundles, modules, compenents, configurations vs. duyunca çok karışık framework havası var ancak işin aslı Symfony Framework sadece Request objesini alıp Response objesine dönüştürmesi. Symfony nin ana mantığının anlaşılması için Request/Response yapısı anlaşılması zorunlu sayılabilir.

Dönüştürme olayı buradaki iki satırdan anlaşılabilir. Gelen Request params ile bir Request objesi oluşturuluyor. Sonrasında application kernel request i handle ettikten sonra bir Response objesi return ediyor ve client a response gönderiliyor. Bu şekilde tek cümlede anlatınca application kernel in yaptığı basit bir olay gibi duruyor. Asıl olay o arada oluyor :D
enter image description here
Application kernel e geçmeden önce symfony/http-foundation paketinden bahsedersek. Request-Response objeleri burada host ediliyor. Request class ını incelerseniz. Yaptığı işlem gelen request i normalize etmek. Misal $_GET['behram'] yerine $request->query->get('behram') şeklinde kullanabiliyorsunuz. Response class ‘ı da aynı mantıkta incelenebilir. Paketi aynı zamanda spagetti kod bir projeniz dahi olsa kullanabilirsiniz.

Dönüştürülme işini Http Kernel handle ediyor. Yaptığı işlem request i alıp sırasıyla event dispatch etmek ve client için Response hazırlamak. Öncelikle buradan projeyi boot ediyor yani kernelimizde enable edilen tüm bundles ın boot metodunu çalıştırmak oluyor. Sonrasında buradan kernel.controller event ini dispatch ediyor. Hemen devreye routing imiz giriyor ve request e bakıyor istek yapılan url ile ilgili bir routing configuration var mı? Bulabilirse hemen alakalı action ı controller a set ediyor. Eğer ki isterseniz bu event i listen edip routing i override da edebilirsiniz. Bunu yapabilmek büyük projelerde binlerce line yazmaktan kurtarıyor çoğu zaman. Eğer ki exception varsa direk exception event i dispatch ediliyor.

Event Dispatch olayı biraz geniş bir konu kısaca bahsetmiş oldum. Bir ara onun için de post ayarlayacağım. Request -> Response olayında dönüşüm tamamen Event Dispatch ile sağlanıyor. Bu olay bize her aşamada istediğimiz gibi müdahale edebilmemizi sağlıyor. 3. party bir bundle dahi olsa her aşamada müdahalede bulunabiliyorsunuz.

OJS gibi modüler yapıdaki büyük projelerde hayat kurtarıyor. Misal basit bir event listener ile request i dinleyip url farketmeksizin eğer ki japonyadan bir client gelirse jp domainine redirect yapabilirsiniz rahatlıkla. Veya doctrine ile bir obje güncellendiği zaman git bu objeyi slave elasticsearch index inde güncelle diyebilirsiniz. Yapabilecekleriniz çılgınlığınızla alakalı biraz ;)

Sürç-i lisan ettiysek affola,
Mutlu günler :)

Alakalı Linkler;

Comment and share

Neden Symfony?

Öncelikle Symfony bir PHP framework ünden öte bir felsefedir. Gözümde Symfony PHP camiasının rock starıdır. Community si olsun Contributers ekibi olsun yönetici ekibi olsun kaliteli ve profesyonel bir kitle. Bunu sağlayan büyük oranda profesyonel bir şirket olan SensioLabsın projenin takibini yürütmesi, özellikle Fabien Potencier gibi bir core developer ının olması. Fabien Potencier ı araştıranlar anlayacaktır neden bu kadar övdüğümü şuan PHP üzerine yapılan bir çok projenin, framework ün kullandığı compenent ler teknolojiler @fabpot un elinden çıkmadır. Aynı zamanda proje yönetimi konusundada oldukça efsanedir. Örnek projeleri;

Amaç

SensioLabs ‘ın genel düşüncesi reusable components yazmaktır , ki bir component farklı projelerde rahatlıkla kullanılabilsin. Misal şuan Drupal, phpBB, Joomla! ve en çok Symfony alternatif olarak gösterilen Laravel birçok Symfony Components i kullanmaktadır, alakalı link ->. Yani şuana kadar aslında Symfony Components kullanmış olmanız muhtemel.

Core Developer Team

Ekibin büyük kısmı web development konusunda fazlaca tecrübeli ve birçoğu PHP nin önde gelen isimlerinden. Misal kesinlikle lame coders değiller, proje yönetimi nasıl olmalı, problem çözümü nasıl olmalı semver nasıl kullanılmalı vs. birçok konuda bilgi sahibiler. Birde Symfony Core Developer olmak gerçekten çok zor, alakalı link .Sırf bu sayfadaki rollerin, kimin ne yapabileceğinin düzenliliğinden dahi mükemmelliyetçiliği anlamak mümkün.

Contributing

Symfony ye contribute etmek çetrefilli bir iş gerçekten. Herşeyin bir standardı bir prosodürü var neredeyse. Buradan anlaşılacağı üzere development da katı kurallara sahiptir. Yani az biraz coding bilen kişi pr göndereyim benim de katkım olsun diyebileceği bir proje değil kesinlikle. Ben projenin kalitesini bu katı kurallarına bağlayanlarındanım. Fakat yanlış anlaşılmasın symfony nin ~1400 contributer ı var yani aslında biz developer ların elinden çıkma Open Source bir proje.

Semver denince benim aklıma direk Symfony projesi gelir. Sebebi ise mükemmel bir release roadmap i olması. Düşün ki şimdiden 2024 e kadar ki çıkacak releases planı hazır. Bu düzenlilik ne sağlıyor derseniz, birgün sabah kalktığınızda Symfony cahili olarak uyanmıyorsunuz. Misal Symfony3 release de silinecek code uses varsa bunu 2.7 gibi @deprecated işaretlemesini yaparlar ki sen yavaştan code revise ını yap Symfony3 e rahatlıkla geçebilesin. Özellikle büyük projeler için kararlı ve doğru semver kullanımı hayati öneme sahip. Symfony ile birgün composer update yaptığınızda patlama ihtimaliniz çok düşük. Aynı konunun Pythonve Angular.jsörneklerini araştırabilirsiniz.

Documantation

O kadar çok dilin framework ün doc. unu okumuşumdur kesinlikle Symfony bu konuda bir dünya markası. Eğer ki bir contributing yapılıyorsa kesinlikle onun doc. uda ekleniyor. Buradan browse edileceği üzere gayet anlaşılır şekilde rich content ile anlatımlı documentation bulunabilir. Ayrıca örnek kodlar, coding standards ve blog yazıları gibi bir çok içerik mevcut. Özellikle Best Practices adlı bir bölümü tadından yenmez :) Pdf leri indirerek yolda vs. okuyabilirsiniz. Bana bunlar yetmedi daha görsel birşeyler arıyorum dersen de KnpUniversity var. Birde verdiğim linklerdeki tüm content İngilizce, “Ama benim ingilizcem yok” a cevabım net “derhal terket burayı, ingilizce öğrenene kadarda gelme” :) şaka bir yana ama gerçekten ingilizce olmadan Symfony öğrenmek biryana kaliteli bir developer olmanız imkansız.

Community

Symfony community si fazlasıyla etkin, sorunlarınıza irc kanalından, mail gruplarına, slack grubundan, stackoverflow dan veya direk Github project issues kısmından bildirebilirsiniz, ama öncelikle bir google araması yapmayı unutmayın :). Çok zorda kalırsan da banagönderebilirsin (ama böyle çok aradın bulamadın :)
Alakalı Linkler;

Mimari Bakış

Symfony Framework aslında sadece Symfony Components i birleştiren bir glue den ibarettir (bkn: SymfonyFrameworkBundle). Directory yapısına bakarsanız zaten vendor u çıkardıktan sonra geriye sadece app ın ve web in altında birkaç dosyadan ibaret olduğunu göreceksiniz. Benim gözümde Symfony ‘yi mükemmel kılanda bu modüler bakış açısı. Bu neyi sağlıyor, misal developer arkadaşım ben reusable XBundle yazacağım dediğin zaman bunu fazlasıyla destekliyor. Bu mantıkla Symfony için yapılmış binlerce 3. party bundle mevcut. Misal FosUserBundle, AsseticBundle vs. vs.
Modüler yapı ile neredeyse her noktada process e müdahil olabiliyorsun. Bunu nasıl yapıyor derseniz Event Dispatch mantığı (Farklı bir yazı ile bu konuyu da anlatmaya çalışacağım). Gerek naming gerek directory mapping açısından da kaliteli bir iş.

Şimdilik bu kadar fırsat buldukça bu yazının devamını getirmeye çalışacağım.


“ Symfony is a set of PHP Components, a Web Application framework, a Philosophy, and a Community — all working together in harmony.”


Mutlu Günler :)

Comment and share

Symfony camiasının genel tartışması annotation mı yoksa yaml configuration daha kullanışlıdır. Tüm açılardan bakarak karşılaştırmaya çalışacağım. Aynı zamanda XML de bu karşılaştırmaya katılabilir fakat birçok bundle XML configution desteklemediği için şimdilik ayrı tutuyorum.

Speed (Hız)


Herkezin ilk düşüncesi muhtemelen hız farkı olur mudur? Baştan söyleyeyim ikisi arasında eğer ki bir Symfony projesinden bahsediyorsak hiçbir hız farkı olmayacaktır (Symfony Core Configuration için bahsediyorum). Sebebi şu ki Symfony yi az biraz bilenler bilir bu mantık Doctrine dede aynı şekilde ilk request veya cache:warmup işleminde annotation, yaml veya xml farketmeksizin php ye convert edilir. Sonraki request ler için direk pure php den okunur bu yüzden Doctrine veya Symfony configuration farketmeksizin hız bakımından bir karşılaştırma yapılamaz.

Readability (Okunabilirlik)


Bu maddede bence yaml çok daha readability si yüksek çünkü gereksiz hiçbir karakter içermeden minor indentations ile hızlıca configuration yapabiliyorsunuz. Ayrıca Yaml ı birçok IDE fazlasıyla destekliyor auto indentation yapabiliyorsunuz ve bir standart a bağlı. Annotation da maalesef belirli bir standart olmadığı için okunabilirlik yerlerde, birçok IDE extra plugins ile destekliyor fakat stabil çalışan yok denebilir. Annotation için auto indentation yapan bir plugin yok bildiğim kadarı ile. Eğer ki bir de Doctrine conf. u Annotation ile yapayım derseniz readability ölü diyebiliriz. Bunu verdiğim linkten rahatlıkla anlayabilirsiniz.

Eğer ki birde büyük bir projeden bahsediyorsak muhtelemen onlarca extra bundle kullanılacaktır. Bunun sonucu olarak entitylerde 30 line lara kadar propery annotation görmeniz muhtemel hale geliyor.

İçerikten anlaşılacağı üzere bu maddede ben kesinlikle Yaml destekçisiyim.

Yazım kolaylığı


Eğer ki küçük bir projede çalışıyorsanız misal 2 kişinin çalıştığı max. 20 action olan bir minor bir sistem ise Annotation size fazlası ile hız kazandıracaktır extra dosya create etmeden misal routing için direk action larda annotation kullanarak rahat ve hızlı şekilde yazabilirsin. Aynı şekilde max. 3 entity ile işim var ve çok karmaşık relationsum yok dersen aynı şekilde annotation kullanabilirsin. Ama dersen ki projede 5> kişi var, aktif development süreci var, 300> action ımız 50> entity ve relations çorba dersen kesinlikle Yaml derim, eğer annotation kullanıp gününü conflict resolve ile harcamak istemiyorsan.

Büyük projelerde annotation kullanımında bir süre sonra özellikle entity lerde her bundle için bir conf. ekleyerek 50 line lık bir entity olacaktır 1000 line sonrasında bug çıktığında hangi line da problem var çözmesi zaman alacaktır.

Sonuç olarak bu maddede büyük proje ise kesinlikle Yaml, küçük projeler için Annotation kullanılabilir diyorum.

Grup Çalışması


Symfony nin en aşık olduğum felsefesi directory yapısının mükemmel şekilde dizayn edilmiş olmasıdır. Aynı zamanda naming konusunda gerçekten çok titiz olmaları. Aynı mantıkta bir projede directory yapısını ne kadar düzenli tutarsanız, development ında o derece düzenli ve mantıklı ilerlemesi muhtemel. Bunu fazlasıyla tecrübe etmiş birisi olarak, büyük projelerde proje directory root u ne kadar dağınık(tek merkezde toplanmamış) tutulursa development kolaylığı da o derece kolaylaşıyor.

Bahsettiğim dağınık yapı Yaml ile sağlanabilir. Misal doctrine configuration bir directory de, routing bir directory, validation bir directory, services bir directory de vb. birçok örnek verilebilir. Annotation için düşünürsek entity içerisinde doctrine, validation, bundle configuration da olsun bu da olsun derseniz bu daha merkeziyetçi bir yaklaşım oluyor.

Dağınık yapının ilk yararı git conflict resolve sürenizi minimize eder :). Bir projede 5> kişi çalışıyorsa birisi routing üzerinde çalışırken bir diğeri controllers üzerinde çalışabilir. Aynı şekilde birisi entity lerde düzenleme yaparken diğeri aynı entity nin validation kısmına bakabilir.

Dağınık yapıda file history den fazlasıyla bilgi alınabilir. Benim fazlasıyla kullandığım bir tool dur github da olan aynı zamanda commandline dada bakabileceğiniz, bir dosyanın change history si. Eğer ki misal validation ile ilgili bir history ye bakmak istiyorsunuz Yaml da sadece related entity nin validation dosyasının history sine bakarak çok daha sağlam bilgi edinebilirken. Annotation da related entity nin git history sine bakacaksınız alakasız birçok commit i incelemeniz muhtemel.

Git için benim genel felsefem herzaman için minor parçalar halinde çok commit atmaktır. Sebebi farklı birisi yaptığın işlere baktığında hangi commit ile ne amaçladın en ince detayına kadar anlayabilsin. Bu felsefeyi en iyi destekleyen yapı tabikide dağınık directory yapısı, Yaml configuration.

Bu maddedede benim düşüncem eğer ki 5> kişilik bir proje ekibi varsa Yaml zorunluluk.


Son cümlem: “Sağlam bir projem var diyorsan Yaml, diğer türlü Annotation”


İyi Günler.

Comment and share

Zamanı verimli kullanmak önemli mesele. Bazı araçlar efsane derecede zaman kazandırabiliyor veya işinizi fazlasıyla kolaylaştırabiliyor. Benim kullandığım bazı Chrome eklentileri. En sağlam olanlarını yazacağım çünkü totalde 150 ye yakın extension var Chrome da :)

1 -) RescueTime


Bilgisayarda benim gibi günde ortalama 13 saat geçiriyorsanız zamanınızı nasıl kullandığınız önemli olmaya başlıyor bu tool sayesinde efsane istatislikler alabiliyorsunuz. Hangi uygulama ,sitede ne kadar vakit geçirdiğiniz. Üretkenlik ve eğlence için geçirdiğiniz zamanlar vs. Filtreleme vs. birçok güzel özelliği mevcut. Üstelik android, chrome ve desktop client ları mevcut 7/24 neler yaptığınızı track edebilirsiniz.
image

2 -) Checker Plus for Gmail


Gmail i fazlasıyla kullanan birisi olarak toplamda 6 ya yakın mail adresim var hepsini check etmek zaman alıyor fazlasıyla. Bu extension Google ın official extension undan çok daha iyi multiple account kullanabiliyorsunuz. Fazlasıyla stabil. Kullandıktan sonra muhtemelen Gmail e nadir gireceksiniz. Donation yapmayıda unutmayın.
image

3 -) Tab Snooze


Birçok kişi kullanıyordur muhtemelen. Günde benim gibi çok fazla linke tıklıyoruz. Tıkladıktan sonra okumaya veya incelemeye zamanınız yoksa snooze ediyorsunuz tab ı bir süreliğine zamanı geldiğinde o tabı size yeniden açıyor. Yada benim gibi dikkat dağılmasını önlemek için bulduğunuz linklerin hepsini someday e atıp boş bir zamanınızda güzelce tek tek inceleyebilirsin.
image

4 -) Screencastify


Bazen kısa bir video fazlasıyla zaman kaybını önleyebiliyor. Eğer ki uzun uzun yazışmadan benim gibi hoşlanmıyorsan bu tool ile saniyesinde chrome da gezinirken veya problemi çözerken screen record yapıp alakalı kişiye gönderebilirsin. Ayrıca Google Drive ve Youtube a direct upload yapabilmeniz oldukça hoş. Eğer ki Web Developer iseniz kesinlikle şart gibi.
image

5 -) Black Menu for Google


Bu az bilinen efsanelerden bence benim gibi Google ın birçok servisini dibine kadar kullanıyorsan çok sağlam shortcut lara sahip misal bir Google doc için uzun uzun siteye gir ara falan gerekmeksizin direk toolbar dan iki tıkla ulaşılabilinir. Bunun gibi neredeyse tüm Google serviceleri için integration a sahip.
image

6 -) Sense


Eğer ki elasticsearch ile işin varsa zorunlu gibi sade ve çok tatlı bir extension. Arama sistemleri vb. elasticsearch related işlerde vazgeçilmez. Elasticsearch öğrenmek için de kullanılabilir aynı şekilde.
image

7 -) Wikiwand


Wikipedia da çok takılıyorsanız muhtemelen ui yönünden biraz kötü olduğunu bilirsiniz. Bu çılgınlar wikipedia yı resmen baştan yaratmışlar. Wikipedia da mükemmel bir ui ile takılmak için kullanılabilir. Bence her browser da kesinlikle olmalı gibi. Bir de beğendiğiniz article ları sonra okumak için save edebiliyorsunuz falan güzel çılgınlıkları var.
image

8 -) AddThis


Sosyal medyada girip çıkamayanlardansanız on numara extension her sitede malum share butonlarını bulmak mümkün değil. Bu uygulama ile bulunduğunuz siteyi direk tek tıkla paylaşılabiliniyor. Hem paylaşılan sitenin anasayfasına girip feed flow da kaybolmanıza gerek kalmıyor.
image

9 -) High Contrast


Genelde gece takılıyorsanız pc başında fazla ışık çok yorabilir. Bu uygulama renkleri reverse ediyor yani genel olarak dark theme e geçmiş oluyorsunuz. Ama bazen image ları da işin içine kattığı için saçmalayabiliyor ama genel olarak iyi kullanışlı.
image

10 -) Chrome Remote Desktop


PC nizi android ten full access ile kontrol sağlıyor baya efsane yattığınız yerden pc yi kullanabiliyorsunuz kısaca baya efsane.

11 -) Bookmark Manager


Beğendiğiniz siteleri imleme, tagleme gibi işlemler yapabiliyorsunuz. Sade ve fazlasıyla kullanışlı. İncelediğiniz siteleri tekrar tekrar incelememek için bookmark a atın ama açıklamalı, düşünceleriniz, pozitif negatif yönleri ile sonrasında bakıp direk hatırlayabilirsiniz. Fazlasıyla verimli.

12-) (BONUS) Do It! Shia Labeouf


Arada tıklayıp gaza gelebilirsin :D

Mutlu Günler…

Comment and share

Neredeyse her hafta bir yazı yazmayı düşünüyorum. Planımdaki yazılar aşağıdaki gibi.

1
2
3
4
5
6
7
8
9
10
1. Webtorrent, WebRTC, P2P nedir, Proje incelemesi
2. Symfony Event Dispatch Mantığı
3. Symfony Request|Response yapısı
4. Symfony ile Gelişmiş API mimarisi
5. Symfony ile Gelişmiş Arama Mimarisi
6. OJS projesindeki sağlam problemler ve çözümleri
7. WebSocket nedir, Örnek proje incelemeleri
8. Kullandığım üretken Chrome Eklentileri
9. Symfony Development Environment Kurulumu
10.Symfony Reusable Bundle Development

Comment and share

  • page 1 of 1
Author's picture

Behram ÇELEN

PHP/Symfony Expert


Software Developer


Wroclaw/Poland