更新函数在 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');

您还可以删除您定义的两条额外路由。