使用自定义 json 响应进行 Laravel 验证
Posted
技术标签:
【中文标题】使用自定义 json 响应进行 Laravel 验证【英文标题】:Laravel validation with custom json respons 【发布时间】:2019-07-09 04:57:04 【问题描述】:快速提问。 是否可以更改 laravel 的 JSON 验证响应? 这是针对我在 Laravel 中构建的自定义 API。
验证过程
$validation = $this->validate(
$request, [
'user_id' => 'required',
]);
响应在 json 中显示如下
"message": "The given data was invalid.",
"errors":
"user_id": [
"The user id field is required."
],
最好变成这样。
"common:" [
"status": "invalid",
"message": "Param xxxx is required",
],
改变这种情况的最佳方法是什么? 有没有可能?
谢谢。
【问题讨论】:
为什么要改变这个?你可以在前端管理它。因为 laravel 一次返回一个元素的所有错误。在你的格式中它只是一个。 它用于返回json的自定义api函数。意思是获取某个json格式的模板 还根据当前的响应重新格式化您的预期结果,您到底需要什么?是的,请解释你为什么需要这个? 你能在返回 laravel 验证消息的地方显示你的代码吗? 现在 laravel 通过以下方式自己进行验证。 $validation = $this->validate( $request, [ 'user_id' => 'required', ] ); 【参考方案1】:@Dev Ramesh 解决方案对于在控制器中放置内联仍然完全有效。
对于那些希望将此逻辑抽象为FormRequest 的人,FormRequest
有一个方便的覆盖方法,称为failedValidation
。当这个被命中时,你可以抛出你自己的响应异常,像这样......
/**
* When we fail validation, override our default error.
*
* @param ValidatorContract $validator
*/
protected function failedValidation(\Illuminate\Contracts\Validation\Validator $validator)
$errors = $this->validator->errors();
throw new \Illuminate\Http\Exceptions\HttpResponseException(
response()->json([
'errors' => $errors,
'message' => 'The given data was invalid.',
'testing' => 'Whatever custom data you want here...',
], 422)
);
【讨论】:
【参考方案2】:您可以这样做,它将在全球范围内反映出来。 导航到下面的文件夹并使用 Controller.php 应用程序/Http/控制器
use Illuminate\Http\Request;
在 Controller.php 中编写以下方法并根据需要更改响应。
public function validate(
Request $request,
array $rules,
array $messages = [],
array $customAttributes = [])
$validator = $this->getValidationFactory()
->make(
$request->all(),
$rules, $messages,
$customAttributes
);
if ($validator->fails())
$errors = (new \Illuminate\Validation\ValidationException($validator))->errors();
throw new \Illuminate\Http\Exceptions\HttpResponseException(response()->json(
[
'status' => false,
'message' => "Some fields are missing!",
'error_code' => 1,
'errors' => $errors
], \Illuminate\Http\JsonResponse::HTTP_UNPROCESSABLE_ENTITY));
我已经用 Laravel 5.6 试过了,也许这对你有用。
【讨论】:
谢谢,我正在找这个。如果我只想显示一个错误怎么办?这也可能吗?就像验证是 user_id 和用户名一样,但我他们都丢失了我只想显示 user_id 而不是用户名的错误。 @WesleySchravendijk,您可以对属性使用bail
规则。
我已经尝试过保释功能,但不知何故它在 laravel 5.7 中不起作用。例如; 'user_id' => '保释|需要',
使用 laravel 8 无法正常工作,我在 Controller.php 中添加了代码,但没有任何效果以上是关于使用自定义 json 响应进行 Laravel 验证的主要内容,如果未能解决你的问题,请参考以下文章
如何自定义 laravel api 的 json 响应并在 vuex 中显示它们
WebSocketChannelException: HandshakeException - Flutter 应用程序与自定义服务器上的 Laravel Websockets 使用 Cpanel 验