Event-Driven Architecture trong Laravel
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));
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);
saveQuietly() để update model mà không
trigger observers.