Larael uygulamanız büyüdükçe, genellikle kontrolcülerin içindeki iş mantığı “dökme alanı” haline gelir. Basit bir kaydolma akışı ile başlarsınız ve bir anda e-posta bildirimleri, Slack uyarıları, denetim günlükleri ve üçüncü parti API çağrıları gibi birçok şeyi tek bir metodun içine sıkıştırmış olursunuz.
Bu, klasik “Şişkin Kontrolcü” belirtisidir. Bu durum, kodunuzu kırılgan hale getirir, birim test yapmayı neredeyse imkansız kılar ve Tek Sorumluluk Prensibini ihlal eder. Peki bunu gereksiz kurumsal karmaşıklık getirmeden nasıl çözersiniz? Cevap, basit ve pratik tutulmuş Olay Tabanlı Mimari’de yatıyor.
Sıkı Bağlantının Gizli Maliyeti
Sıkı Bağlantının Gizli Maliyeti
Bir Laravel uygulamasındaki tipik kayıt sürecini düşünün:
public function register(RegisterRequest $request)
{
$user = User::create($request->validated());
// Sıkı şekilde bağlı bağımlılıklar
Mail::to($user)->send(new WelcomeEmail($user));
Log::info('User registered: ' . $user->id);
Analytics::track(, [=> $user->id]);
Newsletter::subscribe($user->email);
return response()->json([ ], 201);
}
Bu kod sezgisel olabilir, ancak mimari olarak toksiktir. Kontrolcü altyapı bilgileriyle yüklenmiştir. Eğer Newsletter API’niz yavaşlarsa, kullanıcı kaydı da gecikme yaşayacaktır. Eğer Mail servisi bir hata verirse, tüm istek başarısız olur ve bu potansiyel veri kaybına yol açar.
KISS Felsefesi: Olaylar ve Dinleyiciler
KISS Felsefesi: Olaylar ve Dinleyiciler
KISS (Keep It Simple, Stupid) ilkesi, aşırı mühendislikten kaçınmamız gerektiğini belirtir. Laravel’de, ayrıştırma sağlamak için RabbitMQ veya Kafka gibi devasa bir mesaj aracına ihtiyacınız yoktur. Laravel’in yerleşik Olay sistemi, %95’lik kullanım durumu için mükemmel bir çözümdür.
Olaylar, bir ara katman olarak işlev görür. Kontrolcünüz, bir eylemin gerçekleştiğini bildirdiğinde, çeşitli dinleyiciler bağımsız olarak tepki verir.
1. Olayı Tanımlamak
Bir olayı, gerekli bağlamı taşıyan bir “veri aktarım nesnesi” olarak düşünün.
class UserRegistered
{
public function __construct(public User $user) {}
}
2. İnce Kontrolcü
Şimdi kontrolcünün refaktör sonrası görünümüne bakalım:
public function register(RegisterRequest $request)
{
$user = User::create($request->validated());
// Eylemi duyur
UserRegistered::dispatch($user);
return response()->json([ ], 201);
}
Böylece ayrıştırarak, kontrolcü sadece kalıcılık ve orkestrasyon üzerine odaklanır; yan etkilere değil.
3. Asenkron Dinleyicilerin Uygulanması
Laravel’deki olayların gerçek gücü, arka planda işleme uygulandığında ortaya çıkar. ShouldQueue arayüzünü uygulayarak, ağır işleri HTTP istek döngüsünden çıkarabilirsiniz.
class SendWelcomeEmail implements ShouldQueue
{
public function handle(UserRegistered $event)
{
Mail::to($event->user)->send(new WelcomeEmail($event->user));
}
}
Bu Mimari Neden Ölçeklenebilir?
Bu Mimari Neden Ölçeklenebilir?
Olaylara uyum sağladığınızda, sadece daha temiz kontrolcüler kazanmakla kalmazsınız; sistem dayanıklılığınızı da artırırsınız:
Hata Toleransı: Eğer Newsletter servisi geçici olarak kullanılamıyorsa, dinleyici görevi otomatik olarak yeniden dener ve kullanıcının kaydını etkilemez.
Performans: Kullanıcı derhal 201 yanıtını alır; arka plandaki ikinci işler (analitik gibi) ise çalışır.
Genişletilebilirlik: Bir kullanıcı kaydında “Push Bildirimi” eklemek mi istiyorsunuz? Yeni bir dinleyici oluşturun. Kayıt kontrolcü mantığını hiç değiştirmek zorunda kalmazsınız; bu da gerileme hatalarının riskini ortadan kaldırır.
Test Sözleşmeleri: Artık, karmaşık dış mail veya günlük hizmetlerini taklit etmeden, UserRegistered olayının ateşlendiğini doğrulayarak kayıt sürecini test edebilirsiniz.
Sandbox Örneği
Sandbox Örneği
Teori bir şeydir ama uygulamadaki kod çok daha anlamlıdır. [Burada Olay Dağıtıcı’nın yalıtılmış bir ortamda nasıl göründüğünü görebilirsiniz ve yeni bir dinleyici eklemenin ne kadar kolay olduğunu deneyin.]
Bu sandbox örneğini kendiniz deneyin: https://onlinephp.io/c/1f7b2
Karmaşıklığı Yönetmek: “Olay Cehennemi” Uyarısı
Karmaşıklığı Yönetmek: “Olay Cehennemi” Uyarısı
Olaylar güçlüdür, ancak bir gümüş kurşun değildir. Aşırı sayıda olay veya “Olay Cehennemi”, izleme yolunun karmaşık hale geldiği “spagetti” akışına yol açabilir.
Akıl sağlığını korumak için bu en iyi uygulamaları izleyin:
Aşırı Soyutlamadan Kaçının: Eğer bir kod parçası yalnızca bir yerde kullanılıyorsa ve asla değişmeyecekse, bir olay oluşturmayın. Basit bir işlev çağrısı daha okunabilir.
Yan Etkilere Odaklanın: Olaylar, işleme sonrası içindir. Uygulamanın çalışması için senkron olarak gerçekleşmesi gereken temel mantık için olayları kullanmayın.
Açıklayıcı İsimlendirme: Geçmiş zaman şeklinde isimler kullanın (OrderPlaced, InvoiceGenerated). Bu, eylemin zaten veritabanına başarıyla işlendiğini açıkça gösterir.
Derinlemesine: Olaylar vs. Model Gözlemcileri
Derinlemesine: Olaylar vs. Model Gözlemcileri
Yaygın bir soru: “Eloquent Gözlemcilerini ne zaman kullanmalıyım?”
Eloquent Gözlemcileri veri tabanı yaşam döngüsü olaylarına (örneğin, oluşturuldu, güncellendi, silindi) sıkı bir şekilde bağlıdır. Yan etki her zaman bir veritabanı değişikliğine bağlı olduğunda mükemmel bir çözümdür. Olaylar ise daha soyuttur. Kullanıcı Giriş Yaptı veya Sipariş Gönderildi gibi bir olay, genel bir güncellenmiş gözlemciden çok daha anlamlıdır. İş hedefi için Olayları tercih edin; düşük seviyeli veritabanı tutarlılığı için Gözlemcileri kullanın.
Arka Plan İşlemlerinde Hataları Yönetmek
Arka Plan İşlemlerinde Hataları Yönetmek
ShouldQueue’ye geçtiğinizde, hata planlamayı dikkate almanız gerekir. Laravel’de dinleyicilerinizin yeniden denemeleri nasıl yöneteceğinizi belirleyebilirsiniz:
public $tries = 3;
public $backoff = 60; // Yeniden deneme arası 60 saniye bekleyin
Bu, geçici kesintilerin (örneğin bir API bağlantısının yanıt vermemesi) veri kaybına yol açmasını engeller.
Son Düşünceler
Son Düşünceler
Olay tabanlı bir tasarıma geçiş yapmak, kodunuzu “şatafatlı” hale getirmekle ilgili değildir. Bunun yerine dayanıklılık ile ilgilidir. Temel kontrolcülerinizin dalgalanmalara karşı dış bağımlılıklardan yalıtılması sayesinde, hata ayıklaması daha kolay, test yapması daha hızlı ve gelecekteki gereksinimlere daha uyumlu bir kod tabanı oluşturursunuz. Küçük başlayın: En büyük kontrolcünüzdeki bir gürültülü yan etkiyi belirleyin ve bugünden itibaren bir dinleyiciye taşıyın. Gelecek benliğiniz ve sunucularınız teşekkür edecek.
Kaynak: Orijinal Makale


