【问题标题】:Laravel 5.7 throws Symfony \ Component \ HttpKernel \ Exception \ MethodNotAllowedHttpException No message error on calling update functionLaravel 5.7 抛出 Symfony \ Component \ HttpKernel \ Exception \ MethodNotAllowedHttpException 调用更新函数时没有消息错误
【发布时间】:2019-05-21 14:34:52
【问题描述】:

我一直在使用 ajax post 使用 Laravel 5.2 成功更新我的数据库信息。视图、控制器和模型已经到位,但是当我使用 Laravel 5.7 实现它时,我收到了这个错误

Symfony\Component\HttpKernel\Exception\> MethodNotAllowedHttpException 没有消息。

使用 Laravel 5.7 是否需要进行任何更改或调整?请帮忙。谢谢

查看

<form class="update-member-form" id="update-member-form" enctype="multipart/form-data">
   {{ csrf_field() }}

   <input type="text" name="id" class="form-control" id="primary_id" value="">

      <div class="form-group">
        <label for="recipient-name" class="col-form-label">Member ID:</label>
        <input type="text" name="member_id" class="form-control" id="member_id" value="" required>
      </div>
      <div class="form-group">
        <label for="recipient-name" class="col-form-label">First Name:</label>
        <input type="text" name="fname" class="form-control" id="editMember_name" value="" required>
      </div>
      <div class="form-group">
        <label for="recipient-name" class="col-form-label">Middle Name:</label>
        <input type="text" name="mname" class="form-control" id="editMember_mname" value="" required>
      </div>
      <div class="form-group">
        <label for="recipient-name" class="col-form-label">Last Name:</label>
        <input type="text" name="lname" class="form-control" id="editMember_lname" value="" required>
      </div>
</form>

<div class="modal-footer">
    <button type="button" class="btn btn-secondary" data-dismiss="modal" onClick="window.location.reload()" >Close</button>
    <button type="button" class="btn btn-primary btn-update-member">Save updates</button>
  </div>

Javascript

$(".btn-update-member").click(function(e){

      e.preventDefault();

      $.post("{{ url('/updatemember') }}", $("#update-member-form").serialize(), function(data){

            if(data.notify == "Success"){

                swal({
                      title: "Record successfully updated",
                      text: "Message will close in 2 seconds",
                      type: "success",
                      timer: 2000
                    });

            } else{

              console.log(data.notify);

            }


          },"json"); 

      });

web.php

Route::post('/updatemember', 'MembersController@update');

控制器

public function update(Request $request, $id)
{
    //
    $updateMember = Member::where( 'id', $request['id'] )
                          ->update( $request->all() );

       if( $updateMember ){

         $notification = "Success";

       } else{

         $notification = "Failed";

       }

     return json_encode( array( 'notify'=>$notification ) );
}

错误:

【问题讨论】:

    标签: javascript ajax laravel laravel-5.7


    【解决方案1】:

    这行代码对我有用。只需添加-&gt;except('_token')

     Member::where( 'id', $request['id'])->update($request->except('_token'));
    

    【讨论】:

      【解决方案2】:

      好的,开始吧 会员.php

      <?php
      
      namespace App;
      
      use Illuminate\Database\Eloquent\Model;
      
      class Member extends Model
      {
          // if you changed the primary key id you need to set it here
          protected $primaryKey = 'primary_id';
          protected $guarded = [];
          // Also to work it with route model binding you need this too
          public function getRouteKeyName()
          {
              return 'primary_id';
          }
      }
      

      然后是web.php

      // Get The Form name param has to be the same name as the controller variable
      Route::get('/members/{member}/edit', 'MembersController@edit');
      // Patch the form. 
      // Not post because you are not creating. 
      // Not put because you are not replacing. 
      // Patch because you are updating 
      Route::patch('/members/{member}/edit', 'MembersController@update')->name('member.update');
      

      然后是 MembersController.php

      <?php
      
      namespace App\Http\Controllers;
      
      use Illuminate\Http\Request;
      use App\Member;
      
      class MembersController extends Controller
      {
          // Bind the route to the model. It throws 404 if the member does not exit;
          public function edit(Request $request, Member $member)
          {
              return view('members.edit', compact('member'));
          }
      
          public function update(Request $request, Member $member)
          {
              die('i am here update');
          }
      }
      

      当然还有表格

      <form class="update-member-form" id="update-member-form" enctype="multipart/form-data">
         @csrf
         @method('PATCH') 
          <div class="form-group">
            <label for="recipient-name" class="col-form-label">Member ID:</label>
            <input type="text" name="member_id" class="form-control" id="member_id" value="{{$member->member_id}}" required>
          </div>
          <div class="form-group">
            <label for="recipient-name" class="col-form-label">First Name:</label>
            <input type="text" name="fname" class="form-control" id="editMember_name" value="{{$member->fname}}" required>
          </div>
          <div class="form-group">
            <label for="recipient-name" class="col-form-label">Middle Name:</label>
            <input type="text" name="mname" class="form-control" id="editMember_mname" value="{{$member->mname}}" required>
          </div>
          <div class="form-group">
            <label for="recipient-name" class="col-form-label">Last Name:</label>
            <input type="text" name="lname" class="form-control" id="editMember_lname" value="{{$member->lname}}" required>
          </div>
      </form>
      
      <div class="modal-footer">
          <button type="button" class="btn btn-secondary" data-dismiss="modal" onClick="window.location.reload()" >Close</button>
          <button type="button" class="btn btn-primary btn-update-member">Save updates</button>
        </div>
      <script src="https://code.jquery.com/jquery-3.3.1.min.js" integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=" crossorigin="anonymous"></script>
      <script>
        $(".btn-update-member").click(function(e){
      
        e.preventDefault();
      
        $.post("{{ route('member.update', $member->primary_id) }}", $("#update-member-form").serialize(), function(data){
      
              if(data.notify == "Success"){
      
                  swal({
                        title: "Record successfully updated",
                        text: "Message will close in 2 seconds",
                        type: "success",
                        timer: 2000
                      });
      
              } else{
      
                console.log(data.notify);
      
              }
      
      
            },"json"); 
      
        });
      </script>
      

      当然,您可以避免路由模型绑定,从输入字段中获取 id,或者只是从路由中获取 int id,然后通过 db 查询成员是否退出和 bla bla bla。

      【讨论】:

        【解决方案3】:

        问题是您正在使用 POST 但实际上您必须执行 PUT 才能修复此添加

        <input name="_method" type="hidden" value="PUT">
        

        在表单之后你只需粘贴这个

        别忘了

        <form method="post">
        

        【讨论】:

          【解决方案4】:

          如果你已经放了参数,那么从方法中删除 id:

          public function update(Request $request)
          {
              $updateMember = Member::where( 'id', $request['id'] )
                                    ->update( $request->all() );    
                 if( $updateMember ){    
                   $notification = "Success";    
                 } else{    
                   $notification = "Failed";    
                 }    
               return json_encode( array( 'notify'=>$notification ) );
          }
          

          您必须将路线更改为:

          Route::post('/updatemember/{id}', 'MembersController@update');
          

          还有在js中:

          $.post("{{ url('/updatemember/yourid') }}", $("#update-member-form").serialize(), function(data){
                      if(data.notify == "Success"){
                       ...
                      } else{
                        console.log(data.notify);
                      }
          

          编辑: 您必须在 id 输入中传递值为空的值:

          <input type="text" name="id" class="form-control" id="primary_id" value="">
          

          【讨论】:

          • 转储你请求的对象并检查你得到的所有参数
          • 在 id 输入中将 id 设置为 value insted of value=""
          • 还是什么都没有 :(
          • 检查您是否在请求中获得了 id
          • $request['id']更改为$request-&gt;id
          【解决方案5】:

          您的路线错误,因为您在更新函数中将$id 作为参数传递,因此请同时更新您的视图文件

          Route::post('/updatemember', 'MembersController@update');
          

          改为

          Route::post('/updatemember/{id}', 'MembersController@update');
          

          【讨论】:

          • 返回 404 抱歉,找不到您要查找的页面。错误
          • Laravel 5.7 已经将该参数 $id 设置为默认值。我没有把它作为参数。
          • 所以请去掉$id表单更新功能,请检查
          猜你喜欢
          • 1970-01-01
          • 2019-07-01
          • 2019-04-11
          • 2018-06-21
          • 2019-04-25
          • 2018-03-25
          • 2021-06-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多