Laravel 6 自定义验证器总是 returns JSON
Laravel 6 custom validator always returns JSON
我一直在我的表单中使用 Ajax 来执行 CRUD,但现在我需要制作一个定期发布的表单,而无需 Ajax。
让我困惑了几个小时的是自定义 PostsRequest::class
运行良好,然而,这是我的问题,验证失败时它回应 JSON 消息。我需要以旧的方式捕获错误,例如:
@error('title')
<div class="alert alert-danger">{{ $message }}</div>
@enderror
但我得到的是浏览器显示:
{
"message": "Please correct the errors.",
"errors": {
"title": [
"The title must be between 15 and 16 characters."
]
}
}
我的控制器中的 store() 方法:
/**
* Store a newly created resource in storage.
*
* @param \App\Http\Requests\Frontend\ReviewsRequest $request
* @param \App\Models\Review $review
*
* @return \Illuminate\Http\Response
* @since 2.2.0
*/
public function store(ReviewsRequest $request, Review $review)
{
try {
\DB::beginTransaction();
$data = $request->all();
$data['active'] = 0;
$data['approved'] = 0;
$review = $review->create($data);
// sync user reviews
$review->users()->sync(auth()->id(), $review->id);
// sync internal reviews
if($request->get('type') == 'internals') {
$review->internals()->sync(1, $review->id);
}
// sync internal reviews
if($request->get('type') == 'firm') {
$review->firms()->sync(120, $review->id);
}
\DB::commit();
return view('frontend.reviews.review_thank_you');
} catch(Exception $e) {
echo $e->getMessage();
} finally {
}
}
我搜索了几乎所有地方,文档、Whosebug 此处、网络等,我发现的只是人们想要 JSON 响应。
在我的 PostsRequest
class 中,我像往常一样设置了 public function rules(){ ... }
和 public function messages( ... )
我可能做错了什么?
感谢您对这个非常愚蠢的问题的任何帮助。
嗯,
已解决。
深入研究代码并跟踪验证过程的每一步后,我终于找到了此行为背后的原因。
在我的 class App\Exceptions\Handler
中,render()
方法有如下重写:
/**
* Render an exception into an HTTP response.
*
* @param \Illuminate\Http\Request $request
* @param \Exception $exception
* @return \Symfony\Component\HttpFoundation\Response
*
* @throws \Exception
*/
public function render($request, Exception $exception)
{
// THIS IS WHERE THE 'BLACK MAGIC' WAS HAPPENING <----
if ($exception instanceof ValidationException){
return response()->json([
'message' =>'Please correct the errors.',
'errors' => $exception->validator->getMessageBag()], 422);
}
return parent::render($request, $exception);
}
有时我们必须从 20 小时的工作时间表中休息一下,以刷新和重置大脑...
感谢所有试图研究这个问题的人。如果有人遇到此类问题,请查看您的 App\Exceptions\Handler::class 方法的逻辑。
我一直在我的表单中使用 Ajax 来执行 CRUD,但现在我需要制作一个定期发布的表单,而无需 Ajax。
让我困惑了几个小时的是自定义 PostsRequest::class
运行良好,然而,这是我的问题,验证失败时它回应 JSON 消息。我需要以旧的方式捕获错误,例如:
@error('title')
<div class="alert alert-danger">{{ $message }}</div>
@enderror
但我得到的是浏览器显示:
{
"message": "Please correct the errors.",
"errors": {
"title": [
"The title must be between 15 and 16 characters."
]
}
}
我的控制器中的 store() 方法:
/**
* Store a newly created resource in storage.
*
* @param \App\Http\Requests\Frontend\ReviewsRequest $request
* @param \App\Models\Review $review
*
* @return \Illuminate\Http\Response
* @since 2.2.0
*/
public function store(ReviewsRequest $request, Review $review)
{
try {
\DB::beginTransaction();
$data = $request->all();
$data['active'] = 0;
$data['approved'] = 0;
$review = $review->create($data);
// sync user reviews
$review->users()->sync(auth()->id(), $review->id);
// sync internal reviews
if($request->get('type') == 'internals') {
$review->internals()->sync(1, $review->id);
}
// sync internal reviews
if($request->get('type') == 'firm') {
$review->firms()->sync(120, $review->id);
}
\DB::commit();
return view('frontend.reviews.review_thank_you');
} catch(Exception $e) {
echo $e->getMessage();
} finally {
}
}
我搜索了几乎所有地方,文档、Whosebug 此处、网络等,我发现的只是人们想要 JSON 响应。
在我的 PostsRequest
class 中,我像往常一样设置了 public function rules(){ ... }
和 public function messages( ... )
我可能做错了什么? 感谢您对这个非常愚蠢的问题的任何帮助。
嗯,
已解决。
深入研究代码并跟踪验证过程的每一步后,我终于找到了此行为背后的原因。
在我的 class App\Exceptions\Handler
中,render()
方法有如下重写:
/**
* Render an exception into an HTTP response.
*
* @param \Illuminate\Http\Request $request
* @param \Exception $exception
* @return \Symfony\Component\HttpFoundation\Response
*
* @throws \Exception
*/
public function render($request, Exception $exception)
{
// THIS IS WHERE THE 'BLACK MAGIC' WAS HAPPENING <----
if ($exception instanceof ValidationException){
return response()->json([
'message' =>'Please correct the errors.',
'errors' => $exception->validator->getMessageBag()], 422);
}
return parent::render($request, $exception);
}
有时我们必须从 20 小时的工作时间表中休息一下,以刷新和重置大脑...
感谢所有试图研究这个问题的人。如果有人遇到此类问题,请查看您的 App\Exceptions\Handler::class 方法的逻辑。