我尝试使用此代码设置自定义验证消息,但没有效果-
class TestController extends Controller
{
public function submit(Request $request)
{
$this->validate($request,
[
'items' => 'required'
],
[
'items.required' => 'test test'
]
);
}
}
但在错误的情况下,我得到了这个回应-
{
"error": "The given data failed to pass validation."
}
这个代码怎么了?
UPD:
早些时候,我编辑AppExceptionsHandler
,将错误(在API响应中)放入特定格式-
{
"error": "123"
}
此代码是验证错误未显示的原因-
public function render($request, Exception $e)
{
return response([
'error' => $e->getMessage()
], 500);
}
我为此更新了Handler::render
方法
public function render($request, Exception $e) {
$response = parent::render($request, $e);
if (isset($response->exception) and !empty($response->exception)) {
return response(['error' => $response->exception->getMessage()], 500);
} else {
return parent::render($request, $e);
}
}
但我认为我需要改进这个代码。
似乎混合了验证rules
和messages
。validate
方法采用3个参数:request
、rules
、messages
。
请尝试这个:
public function submit(Request $request)
{
$rules = [
'items' => 'required',
'otheritems' => 'required',
];
$messages = [
'items.required' => 'Error: Please enter something.',
'otheritems.required' => 'Otheritems are also required',
];
$this->validate($request, $rules, $messages);
}
最新的Lumen版本总是返回JSON,请参阅文档:
验证失败时,
$this->validate
帮助程序将始终返回带有相关错误消息的JSON响应。如果你没有构建一个只发送JSON响应的无状态API,你应该使用完整的Laravel框架。
关于error
的更新:Lumen给出的结果是这样的。
{"items":["Items are required"],"otheritems":["Otheritems are also required"]}
每个未通过验证的项目都会在响应中得到一个条目。所以你的error
包,需要是一个JSON数组。
自定义异常render
方法:
public function render($request, Exception $e)
{
$response = parent::render($request, $e);
if ($response->getStatusCode() == 422) {
$renderResult = parent::render($request, $e);
$returnResult['error'] = json_decode($renderResult->content(), true);
$returnResult = json_encode($returnResult);
return new Response($returnResult, $response->getStatusCode());
} else {
return parent::render($request, $e);
}
}