更新函数在 Laravel 5.4 中继续给出 MethodNotAllowedHttpException
Update function keeps on giving MethodNotAllowedHttpException in Laravel 5.4
我正在尝试通过表单更新值,但我一遍又一遍地收到错误。
这里是 blade 代码
<div class="container" >
<div class="row">
<div class="col-md-12" style="margin-top: 50px; padding-left: 25em">
<div class="col-md-3">
<img src="{{$user->photo ? asset($user->photo->file) :
asset('image/default.png')}}" style="width: 150px; height: 150px; float:
left; border-radius: 50%; margin-right: 25px">
</div>
<div class="col-md-9 ">
{!! Form::model($user, ['method'=>'PUT' ,'action'=>
['ProfileController@update',$user->id],'files'=>true])!!}
<div class=form-group style="margin: 50px">
<h2>{{$user->name}}'s profile</h2>
{!! Form::label('name','Name :') !!}
{!! Form::text('name', null , ['class'=>'form-control'])!!}
{!! Form::label('email', 'Email :') !!}
{!! Form::text('email', null, ['class'=>'form-control']) !!}
{!! Form::label('photo_id', 'Profile Picture :') !!}
{!! Form::file('photo_id', null, ['class'=>'form-control']) !!}
{!! Form::label('password', 'Password:') !!}
{!! Form::password('password', null, ['class'=>'form-control']) !!}
</div>
</div>
<div class="row" style="padding-top: 20px; padding-left: 50%;">
{!! Form::submit('Update Profile', ['class'=>'btn btn-info']) !!}
{!! Form::close() !!}
</div>
</div>
</div>
</div>
这里是控制器部分
public function updateProfile(UserRequest $request, $id)
{
$user = User::findOrFail($id);
if (trim($request->password)==''){
$input = $request->except('password');
}
else{
$input = $request->all();
$input['password'] = bcrypt($request->password);
}
if ($request->file('photo_id'== '')){
$input = $request->except('photo_id');
}
elseif ($file = $request->file('photo_id')){
$name = time() . $file->getClientOriginalName();
$file->move('image', $name);
$photo = Photo::create(['file'=>$name]);
$input['photo_id'] = $photo->id;
}
$user->update($input);
// Session::flash('edited_profile','The profile has been updated');
// $input['password'] = bcrypt($request->password);
return redirect('/');
// return $request->all();
}
我想这可能是因为没有正确分配路线所以我制作了它们而不是资源
Route::resource('/profile/', 'ProfileController');
Route::get('/profile/{id}', 'ProfileController@editProfile')
->name('editProfile');
Route::post('/profile/{id}', 'ProfileController@updateProfile')
->name('updateProfile');
当我试图通过 ProfileController@edit 路线获取视图时,我遇到了 错误。我创建了 ProfileController@editProfile 路由,它开始给我视图,但更新仍然无法正常工作
不更新的问题是您的表单是通过 PUT
提交的,并且您在路由中声明它是 post 调用。因此下面的任一解决方案都可以解决问题:
解决方案 1
update.blade.php
{!! Form::model($user,
['method' => 'PUT',
'action' => [
'ProfileController@update',$user->id
],
'files' => true
])
!!}
web.php
Route::put('/profile/{id}', 'ProfileController@updateProfile')->name('updateProfile');
解决方案 2
update.blade.php
{!! Form::model($user,
['method' => 'POST',
'action' => [
'ProfileController@update',$user->id
],
'files' => true
])
!!}
web.php
Route::post('/profile/{id}', 'ProfileController@updateProfile')->name('updateProfile');
问题出在您的资源路由定义上。您添加了尾部斜杠,这会打乱定义的路由。
在定义资源路由时,定义中最后一个斜线之后的项目是资源,之前的一切只是一个路由前缀。所以,根据 /profile/
的定义,你的资源是空的,你的路由前缀是“/profile”。这就是为什么您的路线未正确定义且未按预期工作的原因。
删除结尾的斜杠,您的配置文件资源路由将起作用:
Route::resource('profile', 'ProfileController');
您还可以删除您定义的两条额外路由。
我正在尝试通过表单更新值,但我一遍又一遍地收到错误。
这里是 blade 代码
<div class="container" >
<div class="row">
<div class="col-md-12" style="margin-top: 50px; padding-left: 25em">
<div class="col-md-3">
<img src="{{$user->photo ? asset($user->photo->file) :
asset('image/default.png')}}" style="width: 150px; height: 150px; float:
left; border-radius: 50%; margin-right: 25px">
</div>
<div class="col-md-9 ">
{!! Form::model($user, ['method'=>'PUT' ,'action'=>
['ProfileController@update',$user->id],'files'=>true])!!}
<div class=form-group style="margin: 50px">
<h2>{{$user->name}}'s profile</h2>
{!! Form::label('name','Name :') !!}
{!! Form::text('name', null , ['class'=>'form-control'])!!}
{!! Form::label('email', 'Email :') !!}
{!! Form::text('email', null, ['class'=>'form-control']) !!}
{!! Form::label('photo_id', 'Profile Picture :') !!}
{!! Form::file('photo_id', null, ['class'=>'form-control']) !!}
{!! Form::label('password', 'Password:') !!}
{!! Form::password('password', null, ['class'=>'form-control']) !!}
</div>
</div>
<div class="row" style="padding-top: 20px; padding-left: 50%;">
{!! Form::submit('Update Profile', ['class'=>'btn btn-info']) !!}
{!! Form::close() !!}
</div>
</div>
</div>
</div>
这里是控制器部分
public function updateProfile(UserRequest $request, $id)
{
$user = User::findOrFail($id);
if (trim($request->password)==''){
$input = $request->except('password');
}
else{
$input = $request->all();
$input['password'] = bcrypt($request->password);
}
if ($request->file('photo_id'== '')){
$input = $request->except('photo_id');
}
elseif ($file = $request->file('photo_id')){
$name = time() . $file->getClientOriginalName();
$file->move('image', $name);
$photo = Photo::create(['file'=>$name]);
$input['photo_id'] = $photo->id;
}
$user->update($input);
// Session::flash('edited_profile','The profile has been updated');
// $input['password'] = bcrypt($request->password);
return redirect('/');
// return $request->all();
}
我想这可能是因为没有正确分配路线所以我制作了它们而不是资源
Route::resource('/profile/', 'ProfileController');
Route::get('/profile/{id}', 'ProfileController@editProfile')
->name('editProfile');
Route::post('/profile/{id}', 'ProfileController@updateProfile')
->name('updateProfile');
当我试图通过 ProfileController@edit 路线获取视图时,我遇到了
不更新的问题是您的表单是通过 PUT
提交的,并且您在路由中声明它是 post 调用。因此下面的任一解决方案都可以解决问题:
解决方案 1
update.blade.php
{!! Form::model($user,
['method' => 'PUT',
'action' => [
'ProfileController@update',$user->id
],
'files' => true
])
!!}
web.php
Route::put('/profile/{id}', 'ProfileController@updateProfile')->name('updateProfile');
解决方案 2
update.blade.php
{!! Form::model($user,
['method' => 'POST',
'action' => [
'ProfileController@update',$user->id
],
'files' => true
])
!!}
web.php
Route::post('/profile/{id}', 'ProfileController@updateProfile')->name('updateProfile');
问题出在您的资源路由定义上。您添加了尾部斜杠,这会打乱定义的路由。
在定义资源路由时,定义中最后一个斜线之后的项目是资源,之前的一切只是一个路由前缀。所以,根据 /profile/
的定义,你的资源是空的,你的路由前缀是“/profile”。这就是为什么您的路线未正确定义且未按预期工作的原因。
删除结尾的斜杠,您的配置文件资源路由将起作用:
Route::resource('profile', 'ProfileController');
您还可以删除您定义的两条额外路由。