【问题标题】:LARAVEL - Missing required parametersLARAVEL - 缺少必需的参数
【发布时间】:2019-08-16 21:45:11
【问题描述】:

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

我正在尝试为我的代码创建一个更新函数,但无法解决此错误。我有一种感觉,这是因为我的更新网址,但我在教程中使用相同的语法,所以各位大神们能帮帮我吗。

缺少 [Route: 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'); 

【问题讨论】:

  • 请提供您的web.php文件中使用的路由定义
  • Route::resource('/Clients', 'clientsCont');

标签: php ajax laravel


【解决方案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

祝你好运!

【讨论】:

    【解决方案2】:

    在您的路由文件中,从 Clients/{Client} 中删除 {},或者最好将其更改为:Clients/update,当您将 {} 放在一些文本周围时,您正在绑定一些参数(实际上是 Eloquent 模型),您应该提供它(提供 ID)当您调用路由时。

    阅读更多Laravel Documentations

    【讨论】:

    • 我的路由文件中没有任何 {} ..... Route::resource('/Clients', 'clientsCont');
    • 我通过url = "{{ route('Clients.update') }}"; 调用路由我如何为其提供ID?
    • 好吧,通过使用 Route::resource 您正在创建多个路由,其中​​之一是 clients/{client} 如果您想解决您的问题,您必须停止使用 {} 和路由模型绑定,或者使用路由时提供模型 ID。
    【解决方案3】:

    首先,让我们制定一些约定。

    将您的路线定义更改为

    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 调用,并像字符串一样使用。这默认调用 toString 方法并将结果作为 Ajax 请求中的数据发送到服务器。

    请参阅this 了解完整说明。确保您需要此设置,否则将其全部丢弃。

    您可能需要放弃的另一个 Ajax 设置是contentType: false,除非您有充分的理由设置它。

    【讨论】:

      猜你喜欢
      • 2020-09-27
      • 1970-01-01
      • 2021-01-31
      • 2021-07-20
      • 2017-12-27
      • 1970-01-01
      • 2021-11-15
      • 2020-05-07
      • 2021-11-06
      相关资源
      最近更新 更多