Laravel 5 更改表单请求失败的验证行为

Posted

技术标签:

【中文标题】Laravel 5 更改表单请求失败的验证行为【英文标题】:Laravel 5 change form request failed validation behavior 【发布时间】:2015-08-12 05:22:48 【问题描述】:

我有一个表单请求来验证注册数据。该应用程序是一个移动 API,我希望此类在验证失败的情况下返回格式化的 JSON,而不是默认情况下(重定向)。

我尝试从Illuminate\Foundation\Http\FormRequest 类覆盖方法failedValidation。但这似乎不起作用。有什么想法吗?

代码:

<?php

namespace App\Http\Requests;

use App\Http\Requests\Request;
use Illuminate\Contracts\Validation\Validator;

class RegisterFormRequest extends Request 

/**
 * Determine if the user is authorized to make this request.
 *
 * @return bool
 */
public function authorize() 
    return TRUE;


/**
 * Get the validation rules that apply to the request.
 *
 * @return array
 */
public function rules() 
    return [
        'email' => 'email|required|unique:users',
        'password' => 'required|min:6',
    ];



【问题讨论】:

请发布您的代码以供人们检查。 我猜你是通过 AJAX 调用你的 API 吗?你能强制 API 调用从你的 API 中期待 JSON 吗?在 jQuery 中看起来像这样:$.getJSON. 【参考方案1】:

无需重写任何函数。只需添加

Accept: application/json

在您的表单标题中。 Laravel 将以相同的 URL 和 JSON 格式返回响应。

【讨论】:

【参考方案2】:

通过查看Illuminate\Foundation\Http\FormRequest 中的以下函数,Laravel 似乎正确处理了它。

    /**
     * Get the proper failed validation response for the request.
     *
     * @param  array  $errors
     * @return \Symfony\Component\HttpFoundation\Response
     */
    public function response(array $errors)
    
        if ($this->ajax() || $this->wantsJson())
        
            return new JsonResponse($errors, 422);
        

        return $this->redirector->to($this->getRedirectUrl())
                                        ->withInput($this->except($this->dontFlash))
                                        ->withErrors($errors, $this->errorBag);
    

并且根据下面Illuminate\Http\Request 中的wantsJson 函数,您必须明确寻求JSON 响应,

    /**
     * Determine if the current request is asking for JSON in return.
     *
     * @return bool
     */
    public function wantsJson()
    
        $acceptable = $this->getAcceptableContentTypes();

        return isset($acceptable[0]) && $acceptable[0] == 'application/json';
    

【讨论】:

【参考方案3】:

这是我的解决方案,最终效果很好。我在请求代码下面添加了函数:

public function response(array $errors)

    if ($this->ajax() || $this->wantsJson())
    
        return Response::json($errors);
    

    return $this->redirector->to($this->getRedirectUrl())
                                    ->withInput($this->except($this->dontFlash))
                                    ->withErrors($errors, $this->errorBag);

响应函数由 laravel 处理。如果您请求 json 或 ajax,它将自动返回。

【讨论】:

【参考方案4】:

只需在您的请求中添加以下功能:

use Response;
public function response(array $errors)

      return Response::json($errors);    

【讨论】:

以上是关于Laravel 5 更改表单请求失败的验证行为的主要内容,如果未能解决你的问题,请参考以下文章

在 laravel 5 中的表单请求验证后传递旧输入

验证失败时,Laravel 5.3 表单不保留旧输入

Laravel 5 表单请求数据预操作

Laravel 5.5 - 同时验证多个表单请求

在 Laravel 5 中使用表单请求验证时如何添加自定义验证规则

Laravel 5表单请求验证返回禁止错误