Sitemap

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()
]);
}
}

--

--

No responses yet