控制器验证
最后更新于:2022-04-01 15:10:37
当然,如果每一次需要验证的时候都手动的建立并且验证 Validator 实例会非常的麻烦。不用担心,你有其他的选择!Laravel自带的 `App\Http\Controllers\Controller` 基类使用了一个 `ValidatesRequests `的 `trait`。这个 `trait `提供了一个单一的、便捷的方法来验证 HTTP 请求。代码如下:
~~~
/**
* Store the incoming blog post.
*
* @param Request $request
* @return Response
*/
public function store(Request $request)
{
$this->validate($request, [
'title' => 'required|unique|max:255',
'body' => 'required',
]);
//
}
~~~
如果验证通过了,你的代码会正常继续执行。如果验证失败,那么会抛出一个 `Illuminate\Contracts\Validation\ValidationException` 异常。这个异常会被自动捕获,然后重定向至用户上一个页面。而错误信息甚至已经存储至 session 中!
如果收到的是一个 AJAX 请求,那么不会生成一个重定向。相反的,一个带有 422 状态码的 HTTP 响应会被返回给浏览器,包含了一个含有错误信息的 JSON 对象。
比如,如下是手动创建验证的等效写法:
~~~
/**
* Store the incoming blog post.
*
* @param Request $request
* @return Response
*/
public function store(Request $request)
{
$v = Validator::make($request->all(), [
'title' => 'required|unique|max:255',
'body' => 'required',
]);
if ($v->fails())
{
return redirect()->back()->withErrors($v->errors());
}
//
}
~~~
## 自定义闪存后的错误格式
如果你想要自定义验证失败后已经闪存至 session 的错误消息格式,可以通过覆盖基类控制器的 `formatValidationErrors`。不要忘记在文件顶部引入 `Illuminate\Validation\Validator` 类。
~~~
/**
* {@inheritdoc}
*/
protected function formatValidationErrors(Validator $validator)
{
return $validator->errors()->all();
}
~~~