LARAVEL-缺少必需的参数

时间:2019-08-16 07:57:11

标签: php ajax laravel

我是编码新手,我一直在看这个youtube教程,内容是关于在laravel中处理服务器端和数据表的简单服务器,并得到了这个错误,我不知道为什么要得到它。

我正在尝试为我的代码创建一个更新函数,但无法发现此错误。我感觉这是因为我的更新网址,但是我在教程中使用了相同的语法,所以您可以请上帝帮忙。

  

缺少[路由:Clients.update] [URI:   客户/ {客户}]。 (视图:   C:\ xampp \ htdocs \ project \ resources \ views \ clients \ clients.blade.php)

这是我的查看代码

<div id="formmodal" class="modal fade" role="dialog">
  <div class="modal-dialog modal-lg">
    <div class="modal-content">
        <div class="modal-header">
            <h5 class="modal-title" id="exampleModalLabel">Client Form</h5>
            <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                <span aria-hidden="true">&times;</span>
            </button>
        </div>{{-- header --}}
            <div class="modal-body">
                <span class="result" id="result"></span>
                <form method="post" id="client_form" enctype="multipart/form-data">
                    @csrf
                    <div class="form-group">
                        <label for="client_name">Name</label>
                        <input type="text" class="form-control" name="client_name" id="client_name" placeholder="Enter Name">
                    </div>
                    <div class="form-group">
                        <label for="client_address">Addres</label>
                        <input type="text" class="form-control" name="client_address" id="client_address" placeholder="Enter Addres">
                    </div>
                    <div class="form-group">
                        <label for="client_date">Birth Date</label>
                        <input type="date" class="form-control" name="client_bdate" id="client_bdate">
                    </div>
                <div class="modal-footer">
                    <input  type="text" name="action" id="action">
                    <input  type="text" name="hidden_id" id="hidden_id">
                    <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
                    <input type="submit" class="btn btn-primary" name="savebtn" id="savebtn" value="Add">
                </div>
                </form>
            </div>
    </div>
  </div>
</div>

$('#client_form').on('submit', function(event){
    event.preventDefault();
    var url;
    if($('#action').val() == 'Add')
    {
    url = "{{ route('Clients.store') }}";
    }else{
    url = "{{ route('Clients.update') }}";
    }
        $.ajax({
            url: url,
            method: "POST",
            data: new FormData(this),
            contentType: false,
            cache: false,
            processData: false,
            dataType: "json",
            success:function(data)
            {
                var html = '';
                if(data.errors)
                {
                    html = '<diV class="alert alert-danger">';
                    for(var count = 0; count < data.errors.length; count++)
                    {
                        html += '<p>' + data.errors[count] + '</p>';
                    }
                    html += '</div>';
                }
                if(data.success)
                {
                    alert("add");
                    html = '<diV class="alert alert-success">' + data.success + '</div>';
                    $('#client_form')[0].reset();
                    $('#table_id').DataTable().ajax.reload();
                }
                $('#result').html(html);
            }
        })
});

我的控制器代码

public function update(Request $request)
    {
        $rules = array(
            'client_name'       =>  'required',
            'client_address'    =>  'required',
            'client_bdate'      =>  'required'
        );

        $error = Validator::make($request->all(), $rules);

        if($error->fails())
        {
            return response()->json(['errors'=>$error->errors()->all()]);
        }

        $form_data = array(
            'client_name'       =>  $request->client_name,
            'client_address'    =>  $request->client_address,
            'client_bdate'      =>  $request->client_bdate
        );

        Clients::find($request->hidden_id)->update($form_data);

        return response()->json(['success' => 'Data Updated']);

    }

编辑... 我的路线

Route::resource('/Clients', 'clientsCont'); 

3 个答案:

答案 0 :(得分:1)

在您的控制器中,您缺少第二个参数。

所以尝试这样:

public function update(Request $request, Client $client)
    {
        $rules = array(
            'client_name'       =>  'required',
            'client_address'    =>  'required',
            'client_bdate'      =>  'required'
        );

        $error = Validator::make($request->all(), $rules);

        if($error->fails())
        {
            return response()->json(['errors'=>$error->errors()->all()]);
        }

        $form_data = array(
            'client_name'       =>  $request->client_name,
            'client_address'    =>  $request->client_address,
            'client_bdate'      =>  $request->client_bdate
        );
        // You should get your client in variable $client
        //Clients::find($request->hidden_id)->update($form_data);
        $client->update($form_data);

        return response()->json(['success' => 'Data Updated']);
    }

还请注意,如果您希望代码看起来更简单,可以按以下方式验证您的请求:

public function update(Request $request, Client $client)
    {
        $request->validate([
            'client_name'       =>  'required',
            'client_address'    =>  'required',
            'client_bdate'      =>  'required'
        ])
        $client->update($form_data);

        return response()->json(['success' => 'Data Updated']);
    }

您可以阅读更多here

祝你好运!

答案 1 :(得分:1)

在路线文件中,将{}从Clients/{Client}中删除,或者最好将其更改为:Clients/update,将{}放在某些文本周围时,将绑定一些参数(实际上是Eloquent Model),并且您应该在呼叫路线时提供它(提供ID)。

了解更多Laravel Documentations

答案 2 :(得分:0)

首先,让我们放置某些约定。

将路线定义更改为

Route::resource('clients', 'ClientsCont');

按照惯例,控制器名称应为驼峰式,并以大写字母开头。路由名称通常是小写字母。

接下来,确保您的控制器文件正确命名为ClientsCont.php,并且类名称也应为ClientsCont。最后,您必须为update()方法提供第二个参数,以保存要更新的客户端对象。

ClientsCont.php

namespace App\Http\Controllers;
use App\Client;

class ClientsCont extends Controller
{
    // class definition

    public function update(Request $request, Client $client)
    {
        $rules = array(
            'client_name'       =>  'required',
            'client_address'    =>  'required',
            'client_bdate'      =>  'required'
        );

        $error = Validator::make($request->all(), $rules);

        if($error->fails())
        {
            return response()->json(['errors'=>$error->errors()->all()]);
        }

        $form_data = array(
            'client_name'       =>  $request->client_name,
            'client_address'    =>  $request->client_address,
            'client_bdate'      =>  $request->client_bdate
        );

        $client->update($form_data);

        return response()->json(['success' => 'Data Updated']);

    }
}

现在,正确设置您的Ajax请求。

$('#client_form').on('submit', function(event){
    var url;
    if($('#action').val() == 'Add')
    {
        url = "{{ route('clients.store') }}";
    }else{
        url = "{{ route('clients.update') }}";
    }
    $.ajax({
        url: url,
        method: "POST",
        data: new FormData(this),
        cache: false,
        dataType: "json",
        success:function(data)
        {
            var html = '';
            if(data.errors)
            {
                html = '<diV class="alert alert-danger">';
                for(var count = 0; count < data.errors.length; count++)
                {
                    html += '<p>' + data.errors[count] + '</p>';
                }
                html += '</div>';
            }
            if(data.success)
            {
                alert("add");
                html = '<diV class="alert alert-success">' + data.success + '</div>';
                $('#client_form')[0].reset();
                $('#table_id').DataTable().ajax.reload();
            }
            $('#result').html(html);
        }
    })
    return false;
});

通常,使用return false;是停止默认事件动作和传播的首选方法。

  

[return false;] 通常在jQuery代码中看到,它防止浏览器的默认行为,防止事件使DOM冒泡,并立即从任何回调中返回。

有关完整详细信息,请参见此medium write-up

此外,从您的代码中,某些ajax设置是不必要的,应将其省略,以便使用其默认值。这些默认值通常适用于大多数表单。

例如,使用processData: false的jQuery Ajax设置将禁用处理表单数据,并使用对象的toString()方法来形成请求数据字符串。

  

当您将数据设置为通用对象而不是将processData设置为false的字符串时,jQuery不会处理该对象。该对象将按原样传递给Ajax调用,并像使用String一样使用。默认情况下,此方法调用toString方法,并将结果作为Ajax请求中的数据发送到服务器。

有关完整说明,请参见this。确保需要此设置,或者将其全部丢弃。

您可能需要舍弃的另一个Ajax设置是contentType: false,但您有充分的理由进行设置。