Laravel验证错误正在Ajax成功事件中显示

时间:2019-07-24 23:41:27

标签: javascript jquery ajax laravel

当我提交Ajax请求并且知道数据应该失败时,我在success事件而不是fail事件中收到错误响应。

我需要将Laravel的响应发送到Ajax失败事件,因为我将为请求处理失败时构建自定义功能。

我已经尝试了各种尝试来使它正常工作,但是我完全不知道为什么它返回到成功事件中。我一定是笨蛋!

我在控制器中的功能:

    public function add_company(Request $request)
    {

        /**
         * Validate the Add Company request
         */
        $validator = \Validator::make($request->all(), [
            'name' => 'required',
            'sector' => 'required',
            'number' => 'required',
            'email' => 'required',
        ]);

        if ($validator->fails()) {
            return response()->json(['error' => 'Something went wrong']);
        }

        DB::table('companies')->insert([
            'user_id' => Auth::id(), 
            'company_number' => $request->company_number,
            'name' => $request->name,
            'sector' => $request->sector,
            'number' => $request->number,
            'email' => $request->email,
            'address_1' => $request->address_line_1,
            'address_2' => $request->address_line_2,
            'city' => $request->city,
            'postcode' => $request->postcode,
        ]);

        return response()->json(['success' => 'Company created successfully.']);

    }

我的Ajax函数:

$('[data-add-company]').on('submit', function(e) {
    e.preventDefault();
    let $this = $(this);
    let action = $this.attr('action');
    let method = $this.attr('method');

    var formData = $this.serialize();

    $.ajax({
        type: method,
        url: action,
        headers: {
            'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content'),
            'Access-Control-Allow-Origin': '*',
        },
        data: formData,
        success: function(data){
            console.log('success');
            console.log(data); // Fail messages appear here for some reason.
        },
        error: function(data) {
            console.log('error');
            console.log(data);
        },
    });
});

我尝试使用data.successdata.error来获取正确的消息,但是当我键入它们时,它们只是显示为未定义。

应该怎么办

  1. fail事件应在验证失败时启动,并显示来自控制器的正确失败消息。
  2. 一旦成功验证了请求,success事件应仅包含来自控制器的成功消息。

谢谢!

1 个答案:

答案 0 :(得分:1)

似乎正在发生的事情是,即使您的请求在控制器中的验证失败,它仍然会返回有效的响应,JQuery将该响应视为success,从而允许其进入前端的success回调中。

尝试

        if ($validator->fails()) {
           return response()->json(["error" => "something went wrong"], 422);
        }

这应该触发错误回调。

您还可以像这样将错误传递回去:

          return response()->json($validator->errors(), 422);

要获取前端上的所有错误消息。

要进一步阅读,请查看此jQuery error handling article

相关问题