您好,欢迎访问宜昌市隼壹珍商贸有限公司
400 890 5375Laravel模型观察者用于解耦生命周期逻辑,适用于日志记录、缓存同步等场景;通过php artisan make:observer生成并注册,支持retrieved、creating、created等10个事件方法。
在 Laravel 中,模型观察者(Observer)用于监听模型的生命周期事件,比如创建、更新、删除等操作,把相关逻辑从控制器或模型中解耦出来,让代码更清晰、可维护性更强。
当你需要在模型保存前/后自动执行某些操作时,比如:记录日志、同步缓存、发送通知、生成缩略图、更新关联统计字段等。比起在模型的 boot() 里写一堆 creating、saving 回调,Observer 更结构化、易测试、也更容易复用。
使用 Artisan 命令快速生成:
php artisan make:observer UserObserver
--model=User
这会在 app/Observers 下生成 UserObserver.php,并在 AppServiceProvider 的 boot() 方法中注册它:
在 app/Providers/AppServiceProvider.php 中添加:
然后在 boot() 方法里写:
默认支持以下 10 个方法(对应 Eloquent 事件),只需实现你关心的即可:
get、first 等都会)save() 或 create() 前触发(尚未写入 DB)$user->save() 或 $user->update())假设有个 User 模型,希望在用户创建时自动生成唯一邀请码,并在更新邮箱时清除旧邮箱缓存:
namespace App\Observers;
use App\Models\User;
use Illuminate\Support\Str;
class UserObserver
{
public function creating(User $user)
{
if (empty($user->invite_code)) {
$user->invite_code = Str::random(8);
}
}
public function updated(User $user)
{
if ($user->isDirty('email')) {
cache()->forget('user_email_' . $user->getOriginal('email'));
}
}
public function deleted(User $user)
{
// 可选:软删除时清理关联数据,如头像文件
if ($user->avatar) {
\Storage::disk('public')->delete($user->avatar);
}
}
}
注意:isDirty('email') 判断字段是否被修改,getOriginal('email') 获取变更前的值,这对缓存清理很关键。
基本上就这些。Observer 不复杂但容易忽略细节,比如事件触发时机、是否支持软删除、以及避免在 observer 里做耗时操作(必要时应 dispatch job)。用对了,模型层会干净很多。