You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel中使用$observers属性注册观察者不生效问题排查

Laravel Observer通过$observers属性注册无效的排查方案

我在研究Laravel的Observer(观察者)时发现,除了在App\Providers\EventServiceProvider的boot()方法中注册观察者,还可以通过protected $observers属性来注册。但在boot()方法中注册时能正常触发updated事件,使用$observers属性注册却无效,排查不出操作错误,官方文档中也未找到相关解释。

我的EventServiceProvider代码:

class EventServiceProvider extends ServiceProvider
{
    /**
     * Summary of Observers
     * @var mixed
     */
    protected $observers = [
        User::class => [UserObserver::class],
    ];

    /**
     * Register any events for your application.
     *
     * @return void
     */
    public function boot()
    {
        //User::observe(UserObserver::class);
        //Above line is commented because property $observers is used, but uncommented when property observers is commented.
    }
}

我的Observer代码:

class UserObserver
{

    /**
     * Handle the User "updated" event.
     *
     * @param  \App\Models\User  $user
     * @return void
     */
    public function updated(User $user)
    {
        $dirty = $user->getChanges();
        dump($user);
        dd($dirty);
    }
}

排查及解决步骤:

  • 核对命名空间:确保User模型和UserObserver的命名空间正确,且在EventServiceProvider顶部已正确引入这两个类的命名空间。比如User应为App\Models\User,UserObserver应为App\Observers\UserObserver,缺失或错误的命名空间会导致属性注册失效。
  • 清理应用缓存:Laravel的服务提供者缓存可能导致新的属性配置未被加载,执行以下命令清理缓存:
    php artisan cache:clear
    php artisan config:clear
    php artisan optimize:clear
    
  • 确认服务提供者加载状态:检查config/app.php的providers数组中是否包含App\Providers\EventServiceProvider::class,若被误删则属性注册逻辑不会执行。
  • 检查Observer方法权限:确保UserObserver中的updated方法为public访问修饰符(你的代码中已满足,但需避免误改为protected或private)。
  • 排查模型事件开关:检查User模型中是否存在withoutEvents()调用,或者设置了$dispatchesEvents属性覆盖默认事件触发逻辑,这些操作会阻止观察者接收事件。

内容的提问来源于stack exchange,提问作者Nemoko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 03:45:42