Laravel删除评论时控制器delete方法接收id参数为null如何解决
Laravel删除评论功能修复方案
1. 修复路由参数传递错误(导致$id为null的根本原因)
视图中生成删除链接时,route方法的参数数组语法错误,你当前使用的是索引数组['id', $comment->id],Laravel无法匹配路由定义中的{id}参数,因此参数无法正常传递到控制器。
修复代码,将视图中的删除链接替换为:
<a href="{{route('comment.delete', ['id' => $comment->id])}}" class="btn btn-sm btn-danger"> Eliminar </a>
只需将逗号改为=>,转为关联数组,键名与路由中定义的参数名id保持一致即可。
2. 修复控制器逻辑字段错误(参数传递后会遇到的后续问题)
你当前控制器中判断权限的字段名和调用方式存在错误,会导致参数传递成功后仍然报错:
- 不存在
users_id字段,你的comments表外键为user_id - 不存在
images_id->users_id的调用方式,images_id是数值类型的外键,不是模型对象,需通过关联属性images取关联模型的user_id字段
修复后的delete方法代码:
public function delete($id){ //获取当前登录用户 $user = \Auth::user(); //查询评论,找不到id时直接抛404避免后续报错 $comment = Comment::findOrFail($id); //判断是否为评论作者或图片发布者 if ($user && ($comment->user_id == $user->id || $comment->images->user_id == $user->id)) { $comment->delete(); return redirect()->route('image.detail', ['id' => $comment->images->id]) ->with([ 'message' => 'Comentario eliminado' ]); }else{ return redirect()->route('image.detail', ['id' => $comment->images->id]) ->with([ 'message' => 'Comentario NO eliminado!' ]); } }
优化建议
删除操作建议使用DELETE请求而非GET请求,避免爬虫误爬、用户误点链接触发删除,安全性更高:路由改为Route::delete,前端用表单提交并添加@method('DELETE')字段即可。
内容的提问来源于stack exchange,提问作者Tom aguilera
相关产品推荐
相关产品推荐

