【问题标题】:Laravel 5: When store data to database The server responded with a status of 405 (Method Not Allowed)Laravel 5:将数据存储到数据库时服务器响应状态为 405(不允许方法)
【发布时间】:2019-08-31 05:54:32
【问题描述】:

我是 Laravel 的新手,并试图通过 ajax 向数据库添加数据,但它抛出此消息:“服务器响应状态为 405(不允许方法)”我为此定义了两条路由用于表单页面

        Route::get('/create/{id}', 'Participant\ParticipantProjectDefinitionController@create')->name('participant.project-definition.create');

和其他保存这些数据的方法是这样的:

// To save Project definition Data
        Route::get('/store-project-definition-data/{id}', 'Participant\ParticipantProjectDefinitionController@store')->name('participant.project-definition.store');

我使用的 Ajax 代码是这样的:


function storeDefinitionFormData(addUrl, token, baseUrl){
    $('#create_project_definition_data').click(function(e){

    $.ajaxSetup({
        headers: {
            'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
        }
    });
        e.preventDefault();

        var form_fields = [];

        var counter = 0;

        $('.form-group').each(function(){

            var values = {
                'field_name' : $('#field_name_' + counter).val(),
                'field_data' : $('#field_data_' + counter).val(),
            };

            form_fields.push(values);

            counter++;
        });
        $.ajax({
            type: 'POST',
            dataType: 'JSON',
            url: addUrl,
            data: {
                '_token' : token,
                'customer_name' : $('#field_name_0').val(),
                'customer_name' : $('#field_data_0').val(),
                // 'form_fields' : form_fields
            },
            success: function(data){
                alert('done');
                window.location = baseUrl;
            },
            error: function(data){
                alert('fail');
                if(data.status == 422){
                    errors = data.responseJSON.errors; // => colllect all errors from the error bag

                    var fieldCounter = 0;

                    $('.help-block').show();

                    $('.validation').empty(); // => clear all validation

                    // display the validations
                    $('.validation').css({
                        'display' : 'block'
                    });

                    // iterate through each errors
                    $.each(errors, function(key, value){

                        if(key.includes('form_fields.')){
                            var field_errors = key.split('.');

                            var field_error = field_errors[2] + "_" + field_errors[1];

                            $('#' + field_error + '_error').append("<i class='zmdi zmdi-alert-circle' style='font-size: 15px;'></i> " + value); // => append the error value in the error message
                        }

                        $('#' + key + '_help').hide();
                        $('#' + key + '_error').append("<i class='zmdi zmdi-alert-circle' style='font-size: 15px;'></i> " + value); // => append the error value in the error message
                    });
                }
            }
        });
    });
}

控制器代码

 /**
 * create project Definition Form
 *
 */
public function create(request $request, $id){

    $ProjectDefinitionFields = ProjectDefinitionFields::all();

    $ProjectDefinitionFieldRow = ProjectDefinitionFields::where('project_definition_id','=', $id)->get();

    // dd($ProjectDefinitionFieldRow);

    return view('participants.project_definition.create', ['ProjectDefinitionFieldRow' => $ProjectDefinitionFieldRow]); 

}

public function store(request $request, $id,  User $user, ProjectDefinitionFields $ProjectDefinitionFields){

    $project = ProjectDefinitionFields::find('field_id');

    $count = ProjectDefinitionFields::where('project_definition_id','=', $id)->count();

    $pd_id = ProjectDefinitionFields::where('project_definition_id','=', $id)->get();

    for($i=0;$i<$count;$i++){

     $data[]= array (
        'field_name'=>$request->get('field_name_'.$i),
        'field_data'=>$request->get('field_data_'.$i),
        'user_id' => Auth::user()->id,
        // 'user_id' => $request->user()->id,
        'project_definition_id' => $pd_id,
        // 'field_id' => $projectDefinitionFields->id,
    );            
    }

    $project_data = ProjectDefinitionData::create($data); 
    if($project_data){
        return response()->json($project_data);
    }

} 

型号

on ProjectDefinition 
   public function formFields(){
        // return $this->hasMany('App\Model\ProjectDefinitionFields');
        return $this->belongsTo('App\Model\ProjectDefinitionFields');
   }
on projectDefinitionFields
  public function projectDefinition(){
        return $this->belongsTo('App\Model\ProjectDefinition');
    }

这是我的 create.blade.php

<form id="create_project_definition_data_form" enctype="multipart/form-data" >
                            @csrf
                            {{ method_field('PUT') }}
                                <?php $count = 0; ?>
                             @foreach($ProjectDefinitionFieldRow as $value)

                            <div class="row">
                                <div class="form-group col-md-12" id="form-group">
                                    <div class="row">
                                        <label for="definition_data_<?php  echo $count; ?>" class="col-sm-2 col-md-2  col-form-label" id="field_name_<?php  echo $count; ?>" name="field_name_<?php  echo $count; ?>[]" value="{{$value->field_name }}">{{$value->field_name }}</label>
                                        <div class="col-sm-10 col-md-10">
                                           {{--  textbox = 1
                                            textarea = 0 --}}
                                            <<?php  if($value->field_type = 1){echo "input";}else{echo "textarea";} ?> class="form-control" name="field_data_<?php  echo $count; ?>[]" placeholder="Enter project definition_data" id="field_data_<?php  echo $count; ?>" aria-describedby="field_data_help"></<?php if($value->field_type = 1){echo "input";}else{echo "textarea";} ?>>
                                            <small id="field_data_help_<?php  echo $count; ?>" class="form-text text-muted help-block">
                                                Optional Field.
                                            </small>
                                            <span id="field_data_error_<?php  echo $count; ?>" class="invalid-feedback validation"></span>
                                        </div>
                                    </div>
                                </div>
                            </div>

                            <hr />
                            <?php $count++; ?>
                             @endforeach
                                <div class="text-center">
                                    <button type="submit" class="btn btn-primary" id="create_project_definition_data">Create Project Defination Data</button>
                                </div>
                        </form>
@section('scripts')
    <script src="{{ asset('js/participants/project-definition.js') }}"></script>
    <script>
        // on document ready
        $(document).ready(function(){

            var baseUrl = "{{ url('/') }}";

            var indexPdUrl = "{{ route('participant.projectDefinition') }}";

            var token = "{{ csrf_token() }}";

             {{-- // var addUrl = "{{ route('participant.project-definition.create') }}";  --}}

            storeDefinitionFormData(token, baseUrl);

            // console.log(addUrl);

        });
    </script>

错误

Request URL:http://127.0.0.1:8000/participant/project-definition/create/2kxMQc4GvAD13LZC733CjWYLWy8ZzhLFsvmOj3oT
Request method:POST
Remote address:127.0.0.1:8000
Status code: 405 Method Not Allowed
Version:HTTP/1.0

【问题讨论】:

  • 你的这条路线Route::get('/store-project-definition-data/{id}'.....是post吗?如果它尝试更新到Route::post(....
  • @Vipertecpro 是的,我尝试过 POST,但它显示错误消息“此路由不支持 GET 方法。支持的方法:POST”
  • 您是否尝试访问 GET 方法?
  • 是的,但我没有工作
  • 我不明白你为什么要通过 ajax 调用 GET 方法? ajax 假设只调用 POST、PUT、PATCH、DELETE 方法。你想通过 ajax 调用 GET 方法来达到什么目的?

标签: laravel laravel-5.8


【解决方案1】:

在表单中添加方法属性

method="post"

改变你的路线

 Route::get('/store-project-definition-data/{id}', 'Participant\ParticipantProjectDefinitionController@store')->name('participant.project-definition.store');

 Route::post('/store-project-definition-data/{id}', 'Participant\ParticipantProjectDefinitionController@store')->name('participant.project-definition.store');

【讨论】:

  • 我试过然后我发现错误“此路由不支持 GET 方法。支持的方法:POST。”并且仍然显示 405 错误
  • 在表单中提供method='post' 属性
  • 我已经尝试过 PUT 和 Post 这样的方式 {{ method_field('PUT') }}
  • 尝试一次删除 {{ method_field('PUT') }} 并在表单中设置方法'post'
【解决方案2】:

首先,您应该在此处发布您的问题和问题所在,我们不需要查看您的所有代码来解决基本问题。 你的表格应该是这样的:

<form id="create_project_definition_data_form" enctype="multipart/form-data" method='post'>
                            @csrf
                                <?php $count = 0; ?>
                             @foreach($ProjectDefinitionFieldRow as $value)

                            <div class="row">
                                <div class="form-group col-md-12" id="form-group">
                                    <div class="row">
                                        <label for="definition_data_<?php  echo $count; ?>" class="col-sm-2 col-md-2  col-form-label" id="field_name_<?php  echo $count; ?>" name="field_name_<?php  echo $count; ?>[]" value="{{$value->field_name }}">{{$value->field_name }}</label>
                                        <div class="col-sm-10 col-md-10">
                                           {{--  textbox = 1
                                            textarea = 0 --}}
                                            <<?php  if($value->field_type = 1){echo "input";}else{echo "textarea";} ?> class="form-control" name="field_data_<?php  echo $count; ?>[]" placeholder="Enter project definition_data" id="field_data_<?php  echo $count; ?>" aria-describedby="field_data_help"></<?php if($value->field_type = 1){echo "input";}else{echo "textarea";} ?>>
                                            <small id="field_data_help_<?php  echo $count; ?>" class="form-text text-muted help-block">
                                                Optional Field.
                                            </small>
                                            <span id="field_data_error_<?php  echo $count; ?>" class="invalid-feedback validation"></span>
                                        </div>
                                    </div>
                                </div>
                            </div>

                            <hr />
                            <?php $count++; ?>
                             @endforeach
                                <div class="text-center">
                                    <button type="submit" class="btn btn-primary" id="create_project_definition_data">Create Project Defination Data</button>
                                </div>
                        </form>

当你创建一个新的东西时,你应该使用 'post' 方法,这比使用 'get' 方法更安全。所以也要改变路由方法。

        Route::post('/store-project-definition-data/{id}', 'Participant\ParticipantProjectDefinitionController@store')->name('participant.project-definition.store');

另外,在您的“ParticipantProjectDefinitionController->store()”函数中有 $id, User $user, ProjectDefinitionFields $ProjectDefinitionFields 参数,但您的路由器没有。我们可以这样修复它:

Route::post('/store-project-definition-data/{id}/{user}/{ProjectDefinitionFields}', 'Participant\ParticipantProjectDefinitionController@store')->name('participant.project-definition.store');

这意味着您应该将所有这些都传递给您的控制器。 所以我们可以像这样编辑您的 ajax 调用:

function storeDefinitionFormData(addUrl, token, baseUrl){
    $('#create_project_definition_data').click(function(e){

    $.ajaxSetup({
        headers: {
            'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
        }
    });
        e.preventDefault();

        var form_fields = [];

        var counter = 0;

        $('.form-group').each(function(){

            var values = {
                'field_name' : $('#field_name_' + counter).val(),
                'field_data' : $('#field_data_' + counter).val(),
            };

            form_fields.push(values);

            counter++;
        });
        $.ajax({
            type: 'POST',
            dataType: 'JSON',
            url: addUrl,
            data: { // $id,  User $user, ProjectDefinitionFields $ProjectDefinitionFields
                '_token' : token,
                'id' : 'your_id_field',
                'user' : '{{ Auth::user() }}', 
                'ProjectDefinitionFields' : 'your_definition_fields' // you need to pass type of 'ProjectDefinitionFields'
            },
            success: function(data){
                alert('done');
                window.location = baseUrl;
            },
            error: function(data){
                alert('fail');
                if(data.status == 422){
                    errors = data.responseJSON.errors; // => colllect all errors from the error bag

                    var fieldCounter = 0;

                    $('.help-block').show();

                    $('.validation').empty(); // => clear all validation

                    // display the validations
                    $('.validation').css({
                        'display' : 'block'
                    });

                    // iterate through each errors
                    $.each(errors, function(key, value){

                        if(key.includes('form_fields.')){
                            var field_errors = key.split('.');

                            var field_error = field_errors[2] + "_" + field_errors[1];

                            $('#' + field_error + '_error').append("<i class='zmdi zmdi-alert-circle' style='font-size: 15px;'></i> " + value); // => append the error value in the error message
                        }

                        $('#' + key + '_help').hide();
                        $('#' + key + '_error').append("<i class='zmdi zmdi-alert-circle' style='font-size: 15px;'></i> " + value); // => append the error value in the error message
                    });
                }
            }
        });
    });
}

在尝试之前,我会给你一个建议。阅读整个文档并查看其他人在 github 或其他地方所做的工作

【讨论】:

  • 我使用 $id 作为参数和 URL 的原因是我显示的表单字段是动态的,因此为了获取我在此之后使用的参数的表单,同时存储我再次使用 $id 的数据,因为我需要用各自的输入插入外键。
【解决方案3】:
Route::match(['GET','POST'],'/store-project-definition-data/{id}', 'Participant\ParticipantProjectDefinitionController@store')->name('participant.project-definition.store');

你可以试试这条路线,它会解决 405

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2012-12-12
  • 2014-05-01
  • 2014-12-01
  • 2021-02-05
  • 2017-10-19
  • 2015-08-04
相关资源
最近更新 更多