Laravel 5.4用户资料编辑功能出现NotFoundHttpException错误求助
排查你的NotFoundHttpException问题
看了你的代码,这个404错误主要是路由定义缺少必要参数导致的,具体问题和修复方案如下:
1. 核心问题:路由未传递控制器所需的ID参数
你的editProfile($id)和updateProfile(Request $request, $id)方法都需要接收用户ID,但对应的路由完全没包含这个参数占位符:
- 原编辑路由:
Route::get('/content', 'ProfilesController@editProfile')->name('profil.edit'); - 原更新路由:
Route::post('/content', 'ProfilesController@updateProfile')->name('profil.update');
当Laravel尝试匹配请求时,发现控制器期望ID参数,但路由没提供,就会抛出NotFoundHttpException。
2. 修复路由定义
把web.php里的路由改成下面这样,添加参数占位符,同时优化URL语义(/content不够直观,换成和资料相关的路径):
Route::group(['middleware' =>'auth'], function(){ Route::get('/profil', 'ProfilesController@index')->name('profil'); // 添加{user}参数占位符,对应控制器的$id Route::get('/profil/{user}/edit', 'ProfilesController@editProfile')->name('profil.edit'); // 用PUT方法更符合REST规范(更新资源推荐用PUT/PATCH) Route::put('/profil/{user}', 'ProfilesController@updateProfile')->name('profil.update'); });
3. 可选优化:用路由模型绑定简化控制器
Laravel支持路由模型绑定,不用手动User::find($id),直接注入User实例,代码更简洁:
class ProfilesController extends Controller { public function __construct() { $this->middleware('auth'); } public function index() { return view('content.profil'); } // 直接接收User模型实例,自动根据路由参数查找用户 public function editProfile(User $user) { return view('content.edit', compact('user')); } public function updateProfile(Request $request, User $user) { // 可以用fill方法批量赋值(记得在User模型里设置$fillable属性) $user->fill($request->only(['name', 'nom', 'prenom', 'adresse', 'code_postal', 'ville', 'pays', 'num_tele']))->save(); return redirect()->route('profil'); } }
注意:如果用
fill方法,需要在User模型里添加可填充字段:protected $fillable = ['name', 'nom', 'prenom', 'adresse', 'code_postal', 'ville', 'pays', 'num_tele'];
4. 视图链接和表单的修正
- 在
profil.blade.php里,跳转编辑页面的链接要传递当前用户ID:
<a href="{{ route('profil.edit', ['user' => auth()->user()->id]) }}">编辑个人资料</a>
- 在
edit.blade.php的表单里,要添加@method('PUT')来适配PUT请求:
<form action="{{ route('profil.update', ['user' => $user->id]) }}" method="POST"> @csrf @method('PUT') <!-- 表单字段示例 --> <div> <label>姓名:</label> <input type="text" name="name" value="{{ old('name', $user->name) }}" required> </div> <!-- 其他字段同理 --> <button type="submit">保存修改</button> </form>
这样修改后,路由就能正确匹配请求,不会再出现404错误了。
内容的提问来源于stack exchange,提问作者toto01
相关产品推荐
相关产品推荐

