Laravel观察者能监听多个事件吗

wen PHP项目 1

本文目录导读:

Laravel观察者能监听多个事件吗

  1. 支持的事件类型
  2. 示例代码
  3. 注册观察者
  4. 选择性监听事件
  5. 使用 Events 属性(Laravel 8.x+)

是的,Laravel 观察者(Observer)可以监听多个事件,你可以在同一个观察者类中定义多个方法,每个方法对应一个 Eloquent 模型事件。

支持的事件类型

Laravel 观察者支持以下 Eloquent 事件:

  • retrieved - 查询到模型后
  • creating - 创建前
  • created - 创建后
  • updating - 更新前
  • updated - 更新后
  • saving - 保存前(创建或更新)
  • saved - 保存后(创建或更新)
  • deleting - 删除前
  • deleted - 删除后
  • restoring - 软删除恢复前
  • restored - 软删除恢复后
  • forceDeleted - 强制删除后

示例代码

<?php
namespace App\Observers;
use App\Models\User;
use Illuminate\Support\Facades\Log;
class UserObserver
{
    // 创建前
    public function creating(User $user)
    {
        Log::info('正在创建用户', ['email' => $user->email]);
    }
    // 创建后
    public function created(User $user)
    {
        Log::info('用户创建成功', ['id' => $user->id]);
        // 可以在这里执行其他操作,比如发送欢迎邮件
    }
    // 更新前
    public function updating(User $user)
    {
        Log::info('正在更新用户', ['old_email' => $user->getOriginal('email')]);
    }
    // 更新后
    public function updated(User $user)
    {
        Log::info('用户更新成功', ['id' => $user->id]);
    }
    // 删除前
    public function deleting(User $user)
    {
        // 在删除用户之前清理相关数据
        $user->posts()->delete();
        $user->comments()->delete();
    }
    // 删除后
    public function deleted(User $user)
    {
        Log::info('用户已删除', ['id' => $user->id]);
    }
    // 查询后
    public function retrieved(User $user)
    {
        Log::info('查询到用户', ['id' => $user->id]);
    }
}

注册观察者

AppServiceProviderboot 方法中注册:

<?php
namespace App\Providers;
use App\Models\User;
use App\Observers\UserObserver;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
    public function boot()
    {
        // 方式1:注册单个事件
        User::observe(UserObserver::class);
        // 方式2:使用 observe 方法直接定义多个事件
        User::observe([
            UserObserver::class,
            // 还可以注册其他观察者
        ]);
    }
}

选择性监听事件

如果你只想监听特定事件,不需要为所有事件都定义方法:

class UserObserver
{
    // 只监听创建和删除事件
    public function created(User $user) { /* ... */ }
    public function deleted(User $user) { /* ... */ }
    // 不需要为每个事件都写方法
}

使用 Events 属性(Laravel 8.x+)

对于更复杂的场景,可以使用 $events 属性:

class UserObserver
{
    // 定义事件映射
    public $events = [
        'App\Events\UserCreated' => 'handleUserCreated',
        'App\Events\UserUpdated' => 'handleUserUpdated',
    ];
    public function handleUserCreated($event)
    {
        // 处理自定义事件
    }
}

观察者非常适合用于将模型相关的业务逻辑分离,使代码更清晰、可维护。

抱歉,评论功能暂时关闭!