在 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 协议》,转载必须注明作者和本文链接
推荐文章: