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 更改表单请求失败的验证行为的主要内容,如果未能解决你的问题,请参考以下文章