当使用Laravel时,我无法获得 AJAX 调用来将数据传递给类方法

pinkon5k  于 2023-02-25  发布在  其他
关注(0)|答案(1)|浏览(148)

我刚到拉拉威尔。
我想把ajax调用中的两个变量传递给类中的一个方法。
我的ajax调用(来自各种谷歌搜索)是:

var token = $('meta[name="csrf-token"]').attr('content');
    var inputValue = "Testing";
    var anotherInput = "Testing2";
    var data = {};
    data.anotherInput = anotherInput;
    data.inputValue = inputValue;
    data._method = 'POST';
    data._token = token;

            //data: JSON.stringify(data),
        $.ajax({
            url: postUrl,
            type: 'POST',
            headers: {
                'X-CSRF-TOKEN': token
            },
            data: JSON.stringify(data),
            dataType: 'json',
            contentType: 'application/x-www-form-urlencoded; charset=UTF-8',
            processData: false,
            success:function(response)
            {
                console.log(response);
            },
            error: function(response) {
                console.log(response);
            }

        });

变量"postUrl"是在我的layout.blade.php中设置的:

<script>
      var postUrl = "{{ route('filepathtest') }}";
    </script>

我的Controller类的顶部是:

namespace App\Http\Controllers;

use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
 // use Request; 
use Illuminate\Support\Facades\Input;
use Illuminate\Http\Response;
use App\Models\MainSettings;
use App\Http\Requests\MainSettingsRequest;



class MainSettingsController extends Controller
{
    private string $messageTitle = "";
    private $messageText = array();

    /**
     * Corrects path and checks it points to something.
     */
    public function filePathTest(Request $request)
    {
        $data = $request->all();    
        $response = array(
          'msg' => $data,
        );
        return response()->json($response); 
 
    }

最后,我的路线是:

Route::match(array('GET','POST'),'filepathtest', [MainSettingsController::class, 'filePathTest'])->name('filepathtest');

我的响应被记录到Console.Log中,我看到以下内容:

我已经尝试了很多方法从控制器访问变量,但没有效果?我已经尝试:

$data = $request->input('anotherInput');

以及:

$data = $request->anotherInput;

以及:

$data = $request['anotherInput'];

以及:

$data = $request->post('anotherInput');

以及:

$data = $request->request('anotherInput');

但它们似乎都返回null,除了最后一个给我一个错误(除非我只是"使用Request;"而不是"使用Illuminate\Http\Request;")?

nnvyjq4y

nnvyjq4y1#

这似乎是$.ajax()请求的一个综合因素,至少,这应该适用于POST请求:

$.ajax({
  type: 'POST', // or 'PATCH', 'DELETE', etc.
  url: postUrl, // Any valid URL from your Laravel Routes or other external URL
  data: postData // Any plain JS object, or `FormData`, etc.
  // ...
});

在这种情况下,有几个问题:

  1. data: JSON.stringify(data)
    在本例中,您将data对象编码为单个String,并将其发送到控制器。$request->all()使用该JSON字符串作为Array索引,因此在通过\Log::info($request->all());进行日志记录时会出现奇怪的['{"anotherInput":"Testing2", ...}' => null]输出
    这应该只是data: data,或者使用JS对象简写甚至只是data
  2. processData: false
    我不熟悉这个设置,但是您可以查看$.ajax()文档,看看什么时候适合使用这个设置:https://api.jquery.com/jquery.ajax/
  3. dataTypecontentTypeheaders
    这里本身没有任何错误,但是在发出AJAX请求时,请检查是否确实需要这些密钥。如果数据中包含_input密钥,您可能可以忽略headers,但我怀疑发送两次会造成伤害。
    因此,总而言之,代码在重构为以下代码时应该能够正常工作:
$.ajax({
  data: {
    inputValue: 'Testing',
    anotherInput: 'Testing2',
    '_method': 'POST',
    '_token': $('meta[name="csrf-token"]').attr('content'),
  },
  type: 'POST',
  url: postUrl,
  success: function(response) {
    console.log(response);
  },
  error: function(response) {
    console.log(response);
  }
});

在后端,$request->all()应该根据发送的数据返回一个包含4个索引的数组,并且$request->input(...)应该返回其中任何一个索引的值,如果指定的索引无效,则返回null

相关问题