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

Laravel通知未触发求助:按Bootcamp实现后无邮件及日志记录

Laravel事件监听器不触发:发布Chirp后无邮件通知且无日志记录

你提供的ChirpCreated事件和SendChirpCreatedNotifications监听器代码本身没有语法问题,事件监听器未生效大概率是配置或触发环节遗漏,按以下步骤排查:

1. 确认事件与监听器已注册

打开app/Providers/EventServiceProvider.php,检查$listen数组是否包含事件与监听器的绑定关系:

protected $listen = [
    \App\Events\ChirpCreated::class => [
        \App\Listeners\SendChirpCreatedNotifications::class,
    ],
];

如果未添加,补充后执行以下命令清除事件缓存:

php artisan event:clear

2. 确认事件已被正确触发

找到创建Chirp的业务代码(通常在ChirpsController的store方法中),确保创建Chirp实例后触发了事件:

$chirp = auth()->user()->chirps()->create($request->validated());

// 必须添加这行代码触发事件
event(new \App\Events\ChirpCreated($chirp));

3. 检查队列配置与运行状态

由于你的监听器实现了ShouldQueue接口,任务会进入队列执行:

  • 如果.env中QUEUE_CONNECTION设置为sync,任务会同步执行;若设置为database/redis等异步驱动,必须启动队列worker才能处理任务:
    php artisan queue:work
    
  • 可以临时移除监听器的ShouldQueue接口,改为同步执行,测试是否能触发通知,排除队列机制问题。

4. 验证邮件配置与通知逻辑

  • 检查.env中的邮件配置:若使用log驱动,邮件内容会写入storage/logs/laravel.log,可查看日志确认是否有邮件生成记录;若使用SMTP驱动,需确保MAIL_HOST/MAIL_PORT/MAIL_USERNAME等参数正确。
  • 确保系统中存在除发布Chirp用户之外的其他用户,否则监听器中的循环不会执行。
  • 在监听器的handle方法中添加日志输出,验证监听器是否被调用:
    use Illuminate\Support\Facades\Log;
    
    public function handle(ChirpCreated $event): void
    {
        Log::info('ChirpCreated监听器已触发');
        foreach (User::whereNot('id', $event->chirp->user_id)->cursor() as $user) {
            Log::info('准备给用户ID: '.$user->id.'发送通知');
            $user->notify(new NewChirp($event->chirp));
        }
    }
    
    执行操作后查看storage/logs/laravel.log,确认是否有上述日志输出。

5. 清除系统缓存

执行以下命令清除Laravel缓存,避免配置未生效:

php artisan cache:clear
php artisan config:clear

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 02:23:18