【问题标题】:Posting a Laravel AJAX request passes 0 arguments发布 Laravel AJAX 请求会传递 0 个参数
【发布时间】:2020-03-22 00:07:55
【问题描述】:


我在通过 Laravel AJAX 请求传递参数时遇到问题。有很多类似的问题被问到,但似乎没有一个能解决我遇到的问题。

这是我的 Laravel 路线:

Route::get('workerAjax', function(){
    return View::make('workerAjax');
});
Route::post('/workerAjax/post', 'WorkerController@storeWorker');

WorkerController.php

<?php

class WorkerController extends \BaseController {

    public function storeWorker(Request $request){
        return 'I am in';
    }
}

workerAjax.blade.php

<!doctype html>
<html lang="{{ app()->getLocale() }}">
    <head>
        <meta charset="utf-8"/>
        <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
        <meta name="viewport" content="width=device-width, initial-scale=1"/>
        <meta name="_token" content="{{ csrf_token() }}" />

        <title>Register worker</title>
    </head>
    <body>
          <div class="container">
             <div class="alert alert-success" style="display:none"></div>
             <form id="myForm">

                 <!-- don't think I need this, but it doesn't work with or without -->
                <input type="hidden" name="_token" value="{{ csrf_token() }}">

                <div class="form-group">
                  <label for="firstName">First Name:</label>
                  <input type="text" id="firstName">
                </div>
                <div class="form-group">
                  <label for="lastName">Last Name:</label>
                  <input type="text" id="lastName">
                </div>
                <div class="form-group">
                  <label for="email">Email:</label>
                  <input type="text" id="email">
                </div>
                <div class="form-group">
                   <label for="password">Password:</label>
                   <input type="password" id="password">
                 </div>
                <button class="btn btn-primary" id='ajaxSubmit'>Submit</button>
              </form>
          </div>
        <script src="https://code.jquery.com/jquery-3.3.1.min.js"
                       integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8="
                       crossorigin="anonymous">
        </script>
        <script>
         jQuery(document).ready(function(){
            jQuery('#ajaxSubmit').click(function(e){
               e.preventDefault();
               $.ajaxSetup({
                  headers: {
                      'X-CSRF-TOKEN': $('meta[name="_token"]').attr('content')
                  }
              });
               jQuery.ajax({
                  url: "{{ url('/workerAjax/post') }}",
                  method: 'post',
                  data: {
                     firstName: jQuery('#firstName').val(),
                     lastName: jQuery('#lastName').val(),
                     email: jQuery('#email').val(),
                     password: jQuery('#password').val(),
                  },
                  success: function(result){
                      jQuery('.alert').show();
                      jQuery('.alert').html(result.success);
                  }});
               });
            });
        </script>
        </body>
    </html>
</html>

在浏览器中填写表单并单击提交后,我在控制台中收到 POST 错误 500。 网络错误预览显示此消息

error: {type: "Symfony\Component\Debug\Exception\FatalThrowableError",…}
    file: "/path/to/folder/app/controllers/WorkerController.php"
    line: 64 ( public function storeWorker(Request $request){ )
    message: "Type error: Too few arguments to function WorkerController::storeWorker(), 0 passed and exactly 1 expected"
    type: "Symfony\Component\Debug\Exception\FatalThrowableError"

我觉得我做的一切都是正确的,但它仍然无法正常工作。可以请有经验的人帮帮我吗?

编辑: 这是通过请求发送的数据: XHR Request

编辑 2: 我的文件夹结构可能是一个难题,这里是: App folder structure

【问题讨论】:

    标签: php ajax laravel


    【解决方案1】:

    ajax 对象中将 method 键更改为 type

    <script>
    
       jQuery(document).ready(function(){
          jQuery('#ajaxSubmit').click(function(e){
             e.preventDefault();
             $.ajaxSetup({
                headers: {
                    'X-CSRF-TOKEN': $('meta[name="_token"]').attr('content')
                }
            });
            jQuery.ajax({
               url: "{{ url('/workerAjax/post') }}",
               type: 'POST',
               data: {
                  firstName: jQuery('#firstName').val(),
                  lastName: jQuery('#lastName').val(),
                  email: jQuery('#email').val(),
                  password: jQuery('#password').val(),
               },
               success: function(result){
                   jQuery('.alert').show();
                   jQuery('.alert').html(result.success);
               }});
           });
       });
    
    </script>
    

    【讨论】:

    • 遗憾的是没有变化。检查 XHR 标头中的表单数据表明数据已发送,只是没有传递到控制器函数中。
    【解决方案2】:

    您在命名空间声明之后缺少导入请求类:

    use Illuminate\Http\Request;
    

    没有它,Laravel 不知道如何注入这些参数,也不会注入任何东西。

    【讨论】:

      【解决方案3】:

      所以使用命令 ssh php artisan -V,我发现我一直在使用 Laravel 4.2 而不是 Laravel 6.15,因为我的 plesk 安装让我相信。

      我通过直接从路由调用控制器函数解决了这个问题:

      Route::post('/workerAjax/{post}', function(){
          return WorkerController::storeWorker(Input::all());
      });
      

      和 WorkerController.php

      <?php 
      class WorkerController extends \BaseController {
          public function storeWorker($request){
              $val = json_encode($request);
      
              // use for accessing json variables
              $firstName = $request['firstName'];
      
              // alert.(result.success) returns:
              // {"firstName":"John","lastName":"Doe","email":"johndoe@email.com","password":"password1"}
              return Response::json(['success'=>$val],200);
          }
      ?>
      

      感谢大家的意见,我希望这对以后的人有所帮助!

      【讨论】:

        猜你喜欢
        • 2021-10-16
        • 1970-01-01
        • 1970-01-01
        • 2016-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-18
        相关资源
        最近更新 更多