Laravel 11 projenizde event’lar birden çok mu tetikleniyor? Panik yok!
Laravel 11’de eskiden onlarca olan konfigürasyon ve provider dosyaları artık default gelmiyor. Bir kısmı kaldırıldı bir kısmı da istenirse sonradan oluşturulabilecek şekilde ayarlandı.
Projemde bir süredir geliştirdiğim ve AppServiceProvider’da register ettiğim event-listener mekanizmalarını kabaca test ediyordum ve artık bir de canlıda göreyim dedim. Daha ilk seferde bir ürüne yaptığım review iki kez puanlanınca şaşırdım. Localde test ederken rakamları db’den manuel olarak sürekli silip güncellediğim için tutarlılığına pek bakmamıştım.
Canlıda sorun çıkınca kurcalayayım dedim. Bir de baktım ki bizim eventların bir kısmı 2 kere çalışıyor. Bir sürü yere log koydum, yanlışlıkla başka yerde de mi çağırdım vs diye araştırdım. Event bir kere tetikleniyor ama Listener 2 kere çalışıyor. Ve bu başka event’larda da oluyor ama hepsinde olmuyor.
GPT sağolsun klasik kodun orasını burasını kurcala aman EventServiceProvider’a da bak, grep -R ile arat diye beni epey dolaştırdı. Son ümidim Hollanda’da ikamet eden en sevdiğim kayınçom da (bir kayınçom var zaten) nokta atışı yardım edemedi ama Laravel’in event mekanizmasının bir oyunu olduğuna emindi.
Ben de bu kez eski usul Google’da arama yaptım ve benzer sorunlarla karşılaşanlar olduğunu gördüm. Bu arada nasıl oluyorsa (sonda anlatacağım) AppServiceProvider’dan event-listener ikililerini sildiğim halde mekanizma çalışıyordu ve üstelik bu kez düzgün çalışıyordu. Yani bir event olduğunda listener bir kere çalışıyordu.
Meğer Laravel’de “event discovery” denen bir şey varmış. Release dökümanlarını güzel okumazsan böyle olur işte 🙂 Bu event discovery mekanizması Laravel 11’de default açık geliyormuş. Eski sürümlerd EventServiceProvider’in içinde ayarlanıyormuş. Eğer bu işlemi kapatmak istiyorsak EventServiceProvider dosyasını oluşturup gerekli ayarları yapmak yeterliymiş.
Ben öyle yapmadım. GPT’ye bu mekanizmanın nasıl çalıştığını sordum. Eventl’arımın bazısı SomethingHappened -> HandleSomethingHappened şeklinde isimlendirilmişti. Bu “Handle” ifadesinden mi anlıyor Laravel dedim. Yok, dedi. Meğer Event’da değilmiş keramet. Listener’daymış. Listener’ın “handle” metodunda karşılayacak event’i parametre olarak sınıfıyla beraber yazdığımızda Laravel bunu kendi register ediyormuş.
Kayınçoma böyle böyle oldu deyince durumu şu cümleyle özetledi: “Laravel has too much magic :D”. Haklı da. Ama ben bu özelliği sevdim. Bu arada, bazı event’ların neden bu ağa takılmadığı da böylece anlaşılmış oldu. Listener’ın handle methodunda parametre olarak sınıfını kullanmadan yazınca (ki mecburiyetten öyle yazdıklarım vardı) onlar otomatik keşfedilemediğinden manuel register etmek gerekiyormuş.