我正在使用Laravel 5.4。我有一个自定义表单请求类,我有我的验证规则和消息,我在我的控制器中使用它,如下所示:
public function store(CustomFormRequest $request)
{
//
}
我正在使用ajax发送请求,当有任何验证错误时,Laravel会抛出一个带有422状态代码的HTTP响应错误,其中包含验证错误的JSON表示。
但我不希望如此。相反,在我的控制器方法中,我想知道是否存在任何验证错误,如果有,那么我想要返回带有一些额外数据的响应以及验证消息,如下所示:
// Inside my Controller
public function store(CustomFormRequest $request)
{
if ($validator->fails())
{
$errors = $validator->errors();
return response()->json(array('status' => 2, 'msg' => $errors->all() ));
}
}
你可以帮忙吗?
提前谢谢。
答案 0 :(得分:3)
最简单的方法是覆盖Form Request类的response()
方法。
要做到这一点,您只需在课堂上添加以下内容:
public function response(array $errors)
{
if ($this->expectsJson()) {
return new JsonResponse(['status' => 2, 'msg' => $errors], 422);
}
return parent::response($errors);
}
不要导入Illuminate\Http\JsonResponse
希望这有帮助!
答案 1 :(得分:0)
我知道您需要控制器中的逻辑,但您仍然可以利用您的Request文件。在Laravel文档中(假设您使用的是最新版本),它被描述为Adding After Hooks To Form Requests:
如果要在表单请求中添加“after”挂钩,可以使用withValidator方法。此方法接收完全构造的验证器,允许您在实际评估验证规则之前调用其任何方法:
/**
* Configure the validator instance.
*
* @param \Illuminate\Validation\Validator $validator
* @return void
*/
public function withValidator($validator)
{
$validator->after(function ($validator) {
if ($this->somethingElseIsInvalid()) {
$validator->errors()->add('field', 'Something is wrong with this field!');
}
});
}
答案 2 :(得分:0)
试试这个:
form.ajaxSubmit({
async: false,
type: yourMethod,
url: yourRoute,
headers: { 'X-CSRF-TOKEN': "{{csrf_token()}}" },
dataType: 'json',
success: function(data){
location.href = data.redirect_to;
},
error: function(data) {
var errors = data.responseJSON;
var errorsArr = [];
for (error in errors) {
errorsArr.push(errors[error]);
}
errorsArr = $.map(errorsArr, function(n){
return n;
});
alert("<strong class='text-danger'>" + errorsArr.join("<br>") + "</strong>");
console.log(errors);
}
});
并在您的控制器存储方法中返回:
return response()->json(['redirect_to' => '/your_route']);
答案 3 :(得分:0)
在更新laravel文档后,您不再需要覆盖响应(),您只需要在自定义FormRequest类中的受保护的failValidation()中编写您的业务逻辑,如下所示,
use Illuminate\Http\Exceptions\HttpResponseException;
use Illuminate\Contracts\Validation\Validator;
/**
* [failedValidation [Overriding the event validator for custom error response]]
* @param Validator $validator [description]
* @return [object][object of various validation errors]
*/
public function failedValidation(Validator $validator) {
//write your bussiness logic here otherwise it will give same old JSON response
throw new HttpResponseException(response()->json($validator->errors(), 422));
}