在 Lumen 中自定义表单验证返回消息
- 在
lumen的控制器中我们验证表单参数,如:public function store(Request $request) { $this->validate( $request, ['name' =>'required'], ['name.required' => '请填上你的大名'] ); } - 如果未通过,会返回这样格式的
json响应{ "name": [ "请填上你的大名" ] } - 而我们开发 API 通过返回的响应消息不是这样的,这时候我们就可以通过在
\App\Http\Controllers\Controller重写throwValidationException方法实现自定义消息。比如我就重写成这样子。protected function throwValidationException(Request $request, $validator) { $response = [ 'code' => 400, 'msg' => $validator->errors()->first(), 'data' => [] ]; throw new ValidationException($validator, $response); } - 这里最重要的就是抛出了一个
ValidationException异常,后面会说。可以看到主要就是通过验证器,获取错误消息,自己构造了一个响应数组。这时候返回的消息就变成了:{ "code": 400, "msg": "请填上你的大名", "data": [] } - 这样子就基本 OK 了,接下来说一说内部是怎么运行的吧。
- 访问
index.php页面,执行到$app->run()
run方法里的dispatch方法负责分发路由
- 点开
dispatch方法,可以看到里面捕获了异常,再往里面看看
- 点开
sendExceptionToHandler方法看到里面有一个handler对面,我们打印看看(可以看到里面有一个dontReport属性,这里面应该是一个特殊处理的异常类。)

sendExceptionToHandler里面的return $handler->render($this->make('request'), $e);为主要处理方法,点开render看
- 这个方法里面,如果抛出的异常对象的原型是
ValidationException类型且getResponse()返回内容 - 就会直接返回我们定义的
response而不会抛出异常视图。 return $this->prepareResponse($this->sendExceptionToHandler($e));通过sendExceptionToHandler获取到了错误消息数组,prepareResponse方法把数组转换成了Response对象- 几个
return之后我们又回到了run方法,得到了响应并进入Response::send()方法
- 这个方法里面,如果抛出的异常对象的原型是
send方法里有一个sendContent方法里直接输出了content,这样就基本完成消息输出
- 访问
本作品采用《CC 协议》,转载必须注明作者和本文链接

关于 LearnKu
推荐文章: