Отправка запроса Laravel AJAX передает 0 аргументов - PullRequest
0 голосов
/ 20 марта 2020

У меня проблемы с передачей аргументов через 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';
    }
}

рабочий Ajax .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

Редактировать 2: Моя структура папок может быть частью головоломки, вот она: Структура папок приложения

Ответы [ 4 ]

0 голосов
/ 21 марта 2020

Итак, используя команду s sh 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);
    }
?>

Спасибо всем за участие, и я надеюсь, что это поможет кому-то в будущем!

0 голосов
/ 21 марта 2020

Ваша единственная проблема в том, что вы возвращаете строку, а не ответ json. Вы не говорите, какую версию Laravel вы используете. Я использую laravel 7.0. И может расширять Controller вместо \ BaseController

Ваш WorkerController. php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class WorkerController extends Controller
{
    public function storeWorker(Request $request){
    //You must make some validation here

    return response()->json(['success'=>'I am in!']); 
}
}

В вашем коде Javascript, если вы хотите показать предупреждение вместо встроенного html.

success: function(result){
    alert(result.success);
}});
0 голосов
/ 21 марта 2020

Вы не можете импортировать класс запроса после объявления пространства имен:

use Illuminate\Http\Request;

Без него Laravel не знает, как ввести эти параметры, и ничего не вводит.

0 голосов
/ 20 марта 2020

Изменить method ключ на type в ajax объект.

<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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...