Tutorial Laravel #26: Event, Listener, dan Observer

1. Konsep Event-Driven di Laravel

Event-driven programming memungkinkan bagian-bagian aplikasi berkomunikasi tanpa saling bergantung secara langsung. Ketika sesuatu terjadi (event), Laravel akan memberi tahu semua yang tertarik (listener) untuk merespons. Ini membuat kode lebih modular dan mengikuti prinsip Single Responsibility.

2. Membuat Event dan Listener

# Buat event
php artisan make:event ArtikelPublished
php artisan make:event UserRegistered

# Buat listener
php artisan make:listener SendWelcomeEmail --event=UserRegistered
php artisan make:listener NotifySubscribers --event=ArtikelPublished

3. Mendefinisikan Event

<?php
// app/Events/ArtikelPublished.php
namespace AppEvents;

use AppModelsArtikel;
use IlluminateFoundationEventsDispatchable;
use IlluminateQueueSerializesModels;

class ArtikelPublished
{
    use Dispatchable, SerializesModels;

    public function __construct(public Artikel $artikel) {}
}

4. Mendefinisikan Listener

<?php
// app/Listeners/NotifySubscribers.php
namespace AppListeners;

use AppEventsArtikelPublished;
use AppModelsUser;
use AppNotificationsNewArtikelNotification;
use IlluminateContractsQueueShouldQueue;

// Implementasikan ShouldQueue agar listener berjalan di background (queue)
class NotifySubscribers implements ShouldQueue
{
    public function handle(ArtikelPublished $event): void
    {
        $artikel = $event->artikel;

        // Kirim notifikasi ke semua subscriber
        User::where('notify_articles', true)->each(function ($user) use ($artikel) {
            $user->notify(new NewArtikelNotification($artikel));
        });
    }
}

5. Mendaftarkan Event dan Listener

<?php
// app/Providers/AppServiceProvider.php
use AppEventsArtikelPublished;
use AppEventsUserRegistered;
use AppListenersNotifySubscribers;
use AppListenersSendWelcomeEmail;
use IlluminateSupportFacadesEvent;

public function boot(): void
{
    Event::listen(ArtikelPublished::class, NotifySubscribers::class);
    Event::listen(UserRegistered::class, SendWelcomeEmail::class);

    // Atau gunakan discover (Laravel auto-discover listeners)
}

6. Menembak Event (Dispatch)

use AppEventsArtikelPublished;

public function update(Request $request, Artikel $artikel)
{
    $old_status = $artikel->status;
    $artikel->update($request->validated());

    // Tembak event jika status berubah ke published
    if ($old_status !== 'published' && $artikel->status === 'published') {
        ArtikelPublished::dispatch($artikel);
        // atau: event(new ArtikelPublished($artikel));
    }

    return redirect()->route('artikel.index');
}

7. Observer - Event Eloquent

Observer adalah cara lebih terstruktur untuk merespons event Eloquent model (creating, created, updating, updated, deleting, deleted, dsb).

php artisan make:observer ArtikelObserver --model=Artikel
<?php
// app/Observers/ArtikelObserver.php
namespace AppObservers;

use AppModelsArtikel;
use IlluminateSupportStr;

class ArtikelObserver
{
    public function creating(Artikel $artikel): void
    {
        // Auto-generate slug sebelum disimpan
        $artikel->slug = Str::slug($artikel->judul);
    }

    public function created(Artikel $artikel): void
    {
        // Log setelah artikel dibuat
        Log::info("Artikel baru dibuat: {$artikel->judul}");
    }

    public function deleted(Artikel $artikel): void
    {
        // Hapus file gambar saat artikel dihapus
        if ($artikel->gambar) {
            Storage::disk('public')->delete($artikel->gambar);
        }
    }
}
// Daftarkan observer di AppServiceProvider
use AppModelsArtikel;
use AppObserversArtikelObserver;

public function boot(): void
{
    Artikel::observe(ArtikelObserver::class);
}

8. Ringkasan

  • Event system membuat kode lebih modular - satu event bisa punya banyak listener
  • Implementasikan ShouldQueue agar listener berjalan di background
  • Observer cocok untuk merespons lifecycle event Eloquent model
  • Dispatch event dengan EventClass::dispatch($data)

Tutorial berikutnya membahas queue dan job di Laravel.


ariq fadhil

Im Ariq Tech, a Top Rated Fullstack Developer with 5+ years of experience, delivering high-quality solutions across 50+ projects.