Symfony : Events ve Event Listeners

mehmet soylu
3 min readFeb 2, 2021

Buradan sonra Symfony dokumaninin yuzeysel bir cevirisi olacak. Bu yazilari kendim anlamak icin yazdigimi hatirlatirim ve ona gore okumanizi tavsiye ederim. Yanlis / eksik oldugunu dusundugunuz yerler icin yorum yazabilirsiniz. Vaktim oldukca duzeltecegim.

Symfony calismasi sirasinda bir request geldigi zaman pek cok event yani olayi tetikler. Uygulamamiz bu olaylari dinleyerek kodun herhangi bir parcasinda bunlara mudehale edebilir.

Bir HTTP istegi symfony kernel uzerinde pek cok olayi tetikleyecektir. Ayni zamanda ucuncu parti kutuphanelerde bu sekilde eventlere (olaylara) sahip olabilir. Hem symfony kernel icin hem de event tetikleyen bu harici kutuphaneler icin listener yazarak mudehale edebiliriz.

Burada kernel icin kernel.exception olayi uzerinden ornek verilecek. Siz kendi uygulamanizda baska eventleri kullanabilirsiniz.

Bir Event Listener Olusturmak

Bu listeneri service.yaml icinde cagiralim ki sisteme dahil olsun.

Eger ozel bir method belirleseydik name, event yanina method olarak bunu yazardik. Belirlemedigimiz zaman onKernelException() methodu calistirilir. Bu method da yoksa __invoke methodu var mi bakilip calistirilir. Bu method da yoksa yeni bir exception olusur.

Service.yaml icindeki cagriya priority ekleyerek servisin hangi sirada cagrilacagi belirlenebilir. Bu negatif veya pozitif bir tam sayi ile olur. Symfony genellikle kendi cagrilarini -256 ila 256 arasinda yapar. Yani bu aralik disindaki cagrilar symfony servislerinin onune gecer.

Event Subscriber Olusturmak

Eventler icin diger yol event subscriber kullanmak. Subscriberlar bir ya da daha fazla methodlu bir class ile bir ya da daha fazla event uzerinde islem yapabilir. EventListener ile temel fark event subscriber hangi eventi dinledigini tam olarak bilir.

Not : Mesela yukaridaki exception event listener ornegi hem yanlis route cagilarina cevap verir, hem kod icinde tetiklenen exceptionlara cevap verir. Aslinda exception nerede olusmus belirtilmez.

Bir event subscriber icinde farkli eventler farkli onceliklerle calistirilacak sekilde belirtilebilir. Yani bu class icinde yapilabilir. Tipki service.yaml’da event listener cagrilari icin negatif ve pozitif tam sayilar ile yapilabildigi gibi, yuksek oncelik yuksek degerli sayi ile belirtilmis priority icindir.

Bunun anlami ayni zamanda tum event listener ve subscriberlar uzerinden toplanan oncelikler icinde sectigini eventten once mi yoksa sonra mi calisacak bir listener ya da subscriber method yazabileceginizdir. Detaylar icin event dispatcher component inceleyebilirsiniz.

Asagidaki ornekte de tipki yukarida oldugu gibi kernel.exception olayi dinleniyor. Fakat bu sefer bir subscriber ile.

Bu kadar! services.yaml dosyasi zaten default haliyleEventSubscriber dizini icindeki dosyalari calistiriyor. Symfony gerisini hallediyor.

Request Events ve Tur kontrol etmek

Bir sayfa bir cok requeste sahip olabilir. Bir master request ve bir cok alt request olmasi gibi.

Alt request icin kasit twig icerisinde bir controllerin cesitli argumanlar bir request uzerinden gonderilmis gibi cagrilarak ciktisinin template icine dahil edilmesi. Bu son kullanicinin browser URL uzerinden gonderdigi bir master requestten farkli. Bir event listener / subscriber icinde bunu ayirt etmek gerekebilir.

Listeners ya da Subscribers

Listener ve subscriber ayni uygulama kullanilabilir. Hangisini kullanacaginiza karar vermek genellikle kisisel tercihtir. Fakat aralarinda hic fark yok degildir.

  • Subscriber tekrar kullanimi daha kolaydir. Cunku olaylarin bilgisi yaml dosyasinda degil classin kendi icinde tutulur. Zaten Symfony bu yuzden subscriberlari kendi icinde de kullanir.
  • Listener ise daha esnektir. Cunku bir bundle bunlari konfigurasyon ve sartlara gore aktiflestirebilir veya pasiflestirebilir.

Event Aliases

Bir event listener veya subscriber dependency injection ile ayarlanirken Symfony temel ( core ) olaylarina ilgili olay sınıfının tam nitelikli sınıf adı ile basvurulabilir. (FQCN - fully qualified class name)

Dahili olarak, FQCN, orijinal olay adları için alias ( takma ad ) olarak kabul edilir.

Service conteiner derlenirken zaten eslesme gerçekleştiği için, event listener ve subscriber icinde FQCN kullanildiginda, event dispatcher incelenirken orijinal olay adı altında görünecektir.

Not : Sanirim burada alias ile cagrilmis ve FQCN kullanilmamis listenerlar icin de ornegin bir dispatcher listesi asagidaki gibi gorunecek deniliyor.

Bu takma isim haritasi kendi yazdigimiz eventler icin genisletilebilir. Kernel icinde AddEventAliasesPass kullanarak;

Compiler pass ile takma isim haritasina ekleme yapilabilir.

Debugging Event Listeners

Kaydedilmis event listener listesini gormek consolda mumkundur..Tum calisan event listener listesi:

php bin/console debug:event-dispatcher

Spesifik olarak listeinin icinden hedefli bir cagri yapmak:

php bin/console debug:event-dispatcher kernel.exception

--

--