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
相关产品推荐
相关产品推荐

