|
Laravel, uygulamanızdaki belirli işlemlere veya olaylara (event) tepki verebilmek için Event-Listener mimarisini kullanır. Bu yapı, uygulamanın belirli noktalarında tetiklenen olaylara (event) çeşitli işlevler (listener) atayarak çalışır. Böylece, kodunuzu daha modüler ve yönetilebilir hale getirebilirsiniz.
Event ve Listener’ın Amaçları:
- Gevşek Bağlılık (Loose Coupling): Kod parçalarını birbiriyle daha az bağımlı hale getirir.
- Modülerlik: Bir işlemin birden fazla sonucu olduğunda, her bir sonucu ayrı listener olarak tanımlayabilirsiniz.
- Kolay Yönetim: Olayları dinlemek ve gerektiğinde farklı işlevler eklemek çok daha kolaydır.
Event ve Listener Nasıl Çalışır?
- Event: Uygulamada meydana gelen bir olayı temsil eder. Örneğin, bir kullanıcı kayıt olduğunda bir
UserRegistered event tetiklenebilir.
- Listener: Event tetiklendiğinde bu olaya tepki veren bir işlemi tanımlar.
Event ve Listener Oluşturma
Laravel, php artisan komutlarını kullanarak kolayca event ve listener oluşturmanıza olanak sağlar.
Adım 1: Event ve Listener Oluşturma
php artisan make:event UserRegistered
php artisan make:listener SendWelcomeEmail --event=UserRegistered
UserRegistered: Yeni bir event sınıfı oluşturur.
SendWelcomeEmail: UserRegistered olayını dinleyen bir listener oluşturur.
Adım 2: Event Sınıfını Düzenleme
app/Events/UserRegistered.php dosyası şu şekilde olabilir:
<?php
namespace App\Events;
use App\Models\User;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;
class UserRegistered
{
use Dispatchable, SerializesModels;
public $user;
public function __construct(User $user)
{
$this->user = $user;
}
}
Bu event, bir kullanıcı nesnesini (User) içerir ve tetiklendiğinde dinleyicilere bu kullanıcı bilgisini iletir.
Adım 3: Listener Sınıfını Düzenleme
app/Listeners/SendWelcomeEmail.php dosyası şu şekilde olabilir:
<?php
namespace App\Listeners;
use App\Events\UserRegistered;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Support\Facades\Mail;
class SendWelcomeEmail
{
public function __construct()
{
// Gerekirse bağımlılıkları burada tanımlayabilirsiniz.
}
public function handle(UserRegistered $event)
{
$user = $event->user;
// Kullanıcıya hoş geldiniz e-postası gönderme işlemi
Mail::to($user->email)->send(new \App\Mail\WelcomeMail($user));
}
}
Adım 4: Event-Listener İlişkisi Tanımlama
EventServiceProvider dosyasında bu ilişkiyi tanımlamalısınız:
app/Providers/EventServiceProvider.php
protected $listen = [
\App\Events\UserRegistered::class => [
\App\Listeners\SendWelcomeEmail::class,
],
];
Adım 5: Event’i Tetikleme
Bir kullanıcı kayıt olduğunda bu olayı tetiklemek için şu şekilde bir çağrı yapabilirsiniz:
use App\Events\UserRegistered;
// Örnek bir kullanıcı kaydı
$user = User::create([
'name' => 'Atilla',
'email' => 'atilla@example.com',
'password' => bcrypt('password'),
]);
// Event'i tetikle
event(new UserRegistered($user));
Basit Örnek: Log Mesajı Yazdırma
Bir event tetiklendiğinde log dosyasına bir mesaj yazdırmak isterseniz:
Listener
app/Listeners/LogUserRegistered.php
<?php
namespace App\Listeners;
use App\Events\UserRegistered;
use Illuminate\Support\Facades\Log;
class LogUserRegistered
{
public function handle(UserRegistered $event)
{
Log::info('Yeni bir kullanıcı kayıt oldu: ' . $event->user->email);
}
}
EventServiceProvider’a Ekleyin
protected $listen = [
\App\Events\UserRegistered::class => [
\App\Listeners\SendWelcomeEmail::class,
\App\Listeners\LogUserRegistered::class,
],
];
Bu sayede, UserRegistered tetiklendiğinde hem e-posta gönderilir hem de log dosyasına mesaj yazılır.
Queue Kullanımı
Eğer bir listener işlemini sıraya (queue) almak isterseniz, listener sınıfınıza ShouldQueue arayüzünü ekleyin:
use Illuminate\Contracts\Queue\ShouldQueue;
class SendWelcomeEmail implements ShouldQueue
{
// Queue işlemleri otomatik olarak burada çalışır.
}
Özet
Laravel Event-Listener yapısı, olay bazlı iş akışlarını yönetmek için güçlü bir araçtır. Olayların gevşek bağlılıkla yönetilmesi, kodun okunabilirliğini artırır ve ölçeklenebilirliği kolaylaştırır. Event ve listener’ları düzenli bir şekilde kullanarak uygulamanızı daha modüler ve işlevsel hale getirebilirsiniz. |