Laravel Event Sistemi
2 min readNov 5, 2024
Laravel Event sistemini detaylı inceleyelim:
1. Event Nedir?
- Event’ler uygulamanızda gerçekleşen olayları temsil eden sınıflardır
- Uygulama içinde “bir şey olduğunda” diğer kodları haberdar etmek için kullanılır
- SOLID prensiplerinden “Single Responsibility” ve “Open/Closed” prensiplerine uymamızı sağlar
2. Ne Zaman Kullanılır?
Örnek senaryolar:
- Kullanıcı kayıt olduğunda email gönderme
- Sipariş tamamlandığında fatura oluşturma
- Bir blog yazısı yayınlandığında sosyal medyada paylaşım yapma
- Kullanıcı şifresini değiştirdiğinde bilgilendirme maili gönderme
3. Event Sistemi Bileşenleri:
a) Event Sınıfı:
// app/Events/OrderShipped.php
class OrderShipped
{
use Dispatchable, InteractsWithSockets, SerializesModels;
public $order;
public function __construct(Order $order)
{
$this->order = $order;
}
}
b) Listener Sınıfı:
// app/Listeners/SendShipmentNotification.php
class SendShipmentNotification
{
public function handle(OrderShipped $event)
{
// $event->order üzerinden order bilgilerine erişebiliriz
Mail::to($event->order->user)->send(new OrderShippedMail($event->order));
}
}
c) Event Service Provider:
// app/Providers/EventServiceProvider.php
protected $listen = [
OrderShipped::class => [
SendShipmentNotification::class,
UpdateInventory::class,
NotifyAdminAboutShipment::class
]
];
4. Kullanım Örnekleri:
a) Event ve Listener Oluşturma:
# Event oluşturma
php artisan make:event OrderShipped
# Listener oluşturma
php artisan make:listener SendShipmentNotification --event=OrderShipped
b) Event Tetikleme Yöntemleri:
// 1. Event facade kullanarak
Event::dispatch(new OrderShipped($order));
// 2. event() helper kullanarak
event(new OrderShipped($order));
// 3. Dispatchable trait kullanarak
OrderShipped::dispatch($order);
5. Event Türleri:
a) Sync Events (Senkron):
// Varsayılan olarak eventler senkron çalışır
class OrderShipped
{
use Dispatchable, InteractsWithSockets, SerializesModels;
}
b) Queue Events (Asenkron):
// Listener'ı kuyruğa alır
class SendShipmentNotification implements ShouldQueue
{
public $queue = 'listeners'; // Özel kuyruk adı
public $delay = 60; // 60 saniyelik gecikme
}
6. Pratik Örnek:
// 1. Event Oluşturma
class UserRegistered
{
public $user;
public function __construct(User $user)
{
$this->user = $user;
}
}
// 2. Listener Oluşturma
class SendWelcomeEmail
{
private $mailer;
public function __construct(MailerService $mailer)
{
$this->mailer = $mailer;
}
public function handle(UserRegistered $event)
{
$this->mailer->sendWelcomeEmail($event->user);
}
}
// 3. Controller'da Kullanım
class RegisterController
{
public function register(Request $request)
{
$user = User::create($request->all());
event(new UserRegistered($user));
return response()->json(['message' => 'Registered successfully']);
}
}
7. Event’lerin Avantajları:
Loose Coupling (Gevşek Bağlılık):
- Kodunuzu modüler ve bakımı kolay hale getirir
- Sistemin farklı parçaları arasındaki bağımlılığı azaltır
Maintainability (Sürdürülebilirlik):
- Yeni özellikler eklemek kolaydır
- Mevcut kodu değiştirmeden yeni listener’lar ekleyebilirsiniz
Testability (Test Edilebilirlik):
// Event'leri test etme
Event::fake();
// İşlemi gerçekleştir
$user = User::create($data);
// Event'in tetiklendiğini doğrulama
Event::assertDispatched(UserRegistered::class, function ($event) use ($user) {
return $event->user->id === $user->id;
});
Scalability (Ölçeklenebilirlik):
- Queue kullanarak arka plan işlemleri yapabilirsiniz
- Sistem yükünü dağıtabilirsiniz
8. Best Practices:
Event İsimlendirme:
- Geçmiş zaman kullanın: UserRegistered, OrderShipped, PaymentReceived
- Açıklayıcı isimler seçin
Veri Paylaşımı:
- Event sınıfında sadece gerekli dataları paylaşın
- Büyük dataları reference olarak geçin
Error Handling:
public function handle(OrderShipped $event)
{
try {
// Listener logic
} catch (Exception $e) {
logger()->error('Error in OrderShipped listener', [
'order' => $event->order->id,
'error' => $e->getMessage()
]);
}
}