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

Laravel控制器如何向事件监听器传递数据?Undefined property报错解决

问题解决方法

错误原因

你的ToDoEditEvent事件类中仅定义了公共属性$userLog,传入的UserLog实例是存放在该属性下的,$message是UserLog实例的属性,而非ToDoEditEvent的属性,因此监听器直接调用$event->message会触发未定义属性报错。

修复方案

仅需要修改监听器ToDoEditListener中handle方法的取值逻辑,从$event->userLog属性中取message即可,修改后的代码如下:

public function handle(ToDoEditEvent $event)
{
    $currentTimestamp = Carbon::now()->toDateTimeString();
    $addTask = DB::table('user_logs')->insert([
            'message'=>$event->userLog->message,
            'context'=>'Düzenleme',
            'extra'=>Auth::user()->name,
            'created_at'=>$currentTimestamp,
            'updated_at'=>$currentTimestamp
        ]
    );
    return $addTask;
}

可选优化建议

  • 调整控制器中代码执行顺序,先保存任务修改再触发事件,避免任务状态更新失败却生成无效操作日志,同时可以简化状态翻转的判断逻辑:
public function arrangeTask($id)
{
    $task = ToDoTask::find($id);
    $task->completedTask = !$task->completedTask;
    // 先保存任务修改
    $task->save();

    $event = new UserLog();
    $event->message = $task->TaskName;
    event(new ToDoEditEvent($event));

    return redirect()->route('home');
}
  • 监听器中可直接用UserLog模型创建记录,无需手动处理时间戳,Laravel会自动维护created_at和updated_at字段:
public function handle(ToDoEditEvent $event)
{
    return UserLog::create([
        'message' => $event->userLog->message,
        'context' => 'Düzenleme',
        'extra' => Auth::user()->name,
    ]);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 05:12:00