📢

Events & Listeners

Tạo Event và Listener

php artisan make:event OrderPlaced
php artisan make:listener SendOrderConfirmation --event=OrderPlaced
<?php
// app/Events/OrderPlaced.php

namespace App\Events;

use App\Models\Order;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;

class OrderPlaced
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    public function __construct(
        public Order $order
    ) {}
}

// app/Listeners/SendOrderConfirmation.php
namespace App\Listeners;

use App\Events\OrderPlaced;
use App\Mail\OrderConfirmationMail;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Support\Facades\Mail;

class SendOrderConfirmation implements ShouldQueue
{
    public function handle(OrderPlaced $event): void
    {
        Mail::to($event->order->user->email)
            ->send(new OrderConfirmationMail($event->order));
    }

    public function shouldQueue(OrderPlaced $event): bool
    {
        return $event->order->total > 100; // Queue nếu đơn > 100
    }
}

// Đăng ký trong AppServiceProvider (Laravel 11+)
use Illuminate\Support\Facades\Event;

Event::listen(
    OrderPlaced::class,
    SendOrderConfirmation::class
);

// Dispatch event
OrderPlaced::dispatch($order);
// hoặc
event(new OrderPlaced($order));
👁️

Model Observers

Tạo Observer

php artisan make:observer UserObserver --model=User
<?php
// app/Observers/UserObserver.php

namespace App\Observers;

use App\Models\User;
use Illuminate\Support\Facades\Cache;

class UserObserver
{
    public function creating(User $user): void
    {
        $user->uuid = Str::uuid();
    }

    public function created(User $user): void
    {
        // Gửi welcome email
        SendWelcomeEmail::dispatch($user);
        
        // Clear cache
        Cache::forget('users_count');
    }

    public function updated(User $user): void
    {
        if ($user->wasChanged('email')) {
            // Email changed - verify lại
            $user->email_verified_at = null;
            $user->saveQuietly(); // Không trigger observer
        }
    }

    public function deleted(User $user): void
    {
        // Soft delete related data
        $user->posts()->delete();
        $user->comments()->delete();
    }

    public function forceDeleted(User $user): void
    {
        // Hard delete - cleanup files
        Storage::deleteDirectory("users/{$user->id}");
    }
}

// Đăng ký trong Model
class User extends Authenticatable
{
    protected static function booted(): void
    {
        static::observe(UserObserver::class);
    }
}

// Hoặc trong AppServiceProvider
User::observe(UserObserver::class);
💡 Tip: Dùng saveQuietly() để update model mà không trigger observers.
← Bài 5: Queues Bài 7: Realtime →