Laravel’ de Pakete Ait Olay/Dinleyici (Event/Listener) Kurgusu

Mustafa Akçakaya
Dec 31, 2019 · 2 min read

Laravel içerisinde yer alan Event özelliği uygulamamızda herhangi bir senaryoda, bir işlem sonrasında başka işlemlerin tetiklenmesini organize etmemizi sağlıyor. Bir sipariş oluşturduğumuzda OrderPlaced şeklinde bir olay (event) ateşleyip kullanıcıya siparişinin oluşturulduğuna dair bir bildirim gönderebiliyoruz ya da bir kullanıcı üye olduğunda UserRegistered şeklinde bir olay ateşleyip kayıt olan kullanıcıyı abonelik listemize ekleyebiliyoruz. Ayrıca bu işlemleri kuyruğa da alabiliyoruz.

Akabindeki işlemleri olay içerisinde yaptırabildiğimiz gibi onları bir listener, observer, subscriber ya da global listen ile yakalayıp yaptırabiliyoruz ya da yönlendirebiliyoruz. Global listen dışındaki yöntemlere dokümanlarda değinildiği için onları sadece isimlerini yazıp kısaca geçiyorum. Global listen örneği vermek gerekirse:

şeklinde bir örnek konuyu anlatmaya yetecektir. Yeri gelmişken Eloquent olay isimlerini de paylaşayım:

eloquent.booting
eloquent.booted
eloquent.deleting
eloquent.deleted
eloquent.saving
eloquent.saved
eloquent.updating
eloquent.updated
eloquent.creating
eloquent.created
eloquent.restoring
eloquent.restored

Bu kısa girişten sonra şimdi ana konuya geçelim: Kendi yazdığımız paketlerde event/listener kurgusu için nasıl bir yol izlemeliyiz?


Event/Listener kurgusu app/Providers/EventServiceProvider.php içerisinde gerçekleştiriliyor. EventServiceProvider::$listen dizisi içerisinde olayları ve onları yakalayan dinleyicileri belirtiyoruz. Eğer bu sınıfa bakarsanız Illuminate\Foundation\Support\Providers\EventServiceProvider sınıfını ServiceProvider takma ismiyle genişlettiğini görürsünüz. Biz de paketimiz için bu sınıfı genişleten bir provider yazacağız. Burada önemli olan:

  1. Doğru sınıfı genişletmek (Genişleteceğimiz sınıf App\Provders\EventServiceProvider olmamalı)
  2. boot() yöntemi içerisinde parent::boot() yöntemini çağırmak

Buna göre şöyle bir örnek verebiliriz:

Bu şekilde hem ana uygulama içerisinde EntityCreated olayını yakalayabileceğimiz gibi hem de paket içinde ya da dışında ona listener tanımlayabiliyoruz. Arka planda ana EventServiceProvider ile bizim paketinkini birleştiriliyor, üzerine yazmıyor.

Elbette sadece sınıfı oluşturmak bir anlam ifade etmeyecektir. Bu oluşturduğumuz servis sağlayıcıyı kaydetmemiz gerekiyor. Bunun için ise paketimizin servis sağlayıcısını kullanacağız. Eğer bir Laravel paketi yazıyorsanız içerisinde mutlaka bir başlatıcı servis sağlayıcı olması gerektiğini unutmayın. Yazmış olduğumuz MyPackageEventServiceProvider sınıfını ise Application::register() yöntemi ile kaydedeceğiz. Paketimizin başlatıcı servis sağlayıcısı ise kabaca şöyle olacak:

Böylece event/listener kurgusunu da paketleştirmiş olduk.

Herkese iyi çalışmalar.

Mustafa Akçakaya

Written by

PHP/Laravel Developer

ClevelTeam

Teknoloji, Girişimcilik, Proje Geliştirme

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade