laravel Validation验证失败,返回500而不是422

这里是验证规则:

public function rules()
{
    return [
        'user_id' => 'required|integer',
        'news_id' => 'integer|required',
        'content' => 'required'
    ];
}<br></br>

处理代码部分:

public function store(CreateNewsCommentsRequest $request)
{
    $news_id = $request->get('news_id');
    return $news_id;
}<br></br>

我使用的是dingoapi,在远程post的。

perfectboook

解决了,在api的BaseController里面加上一个函数:

public function resourceValidate($rules, $attributes = [])
{
    $playload = Request::all();
    $validator = Validator::make($playload, $rules, [], $attributes);
    if ($validator->fails()) {
        throw new StoreResourceFailedException('validate_failed', $validator->errors());
    }
}

然后在控制器里面调用就行了。

$this->resourceValidate([
    'news_id' => 'integer|required',
    'content' => 'required'
],[
    'content' => '评论内容',
    'news_id' => '新闻ID'
]);

多谢群里的 @茄子 小伙伴。

安正超

@perfectboook 500 是异常,422 是未授权,422 从含义上的理解来讲,它属于业务上的“未登录”操作,而你的验证是属于数据的验证,等同于用户的输入“没有按理想的格式”请求,那这属于逻辑异常。

perfectboook

@安正超 这里的422我是因为文档上Validation那一节我看到有一句:

If the request was an AJAX request, a HTTP response with a 422 status code will be returned to the user including a JSON representation of the validation errors.

我之前做其它项目的时候用ajax也试过返回的是422,而这次使用dingoapi之后返回的是500。我和手机app端约定好了,数据验证错误,我会返回422的错误。它返回500,让我有些纠结了。。因为其他很多情况也会报500的错误。另外,处理未登录不应该是401吗…

安正超

@perfectboook 哦,我单纯的理解为普通的数据验证了,如果在纯 Laravel 项目里确实是标准的 422的,不过 Dingo 的话,也许是你的配置不对或者说没有按 Dingo 描述的场景添加某些必要的组件吧,我还是很久前用它的了,新的版本还没用过,快两年了。哈哈

perfectboook

@安正超 恩恩,dingo这个确实没找到什么导致的。谷歌找到只有一个人有类似问题,也没有解决方法。暂时就先用上面的方法了,毕竟项目催的紧,没时间细抠,哈哈

Admin

嗷,我也遇到这个问题,验证失败dingo返回500错误,且不会返回验证的具体错误。。。

Admin

@perfectboook 在父级控制器像你那样写一个方法来解决感觉就不能用Request来验证了

Cai

dingo返回的是422 ,500是服务器上面的错误,估计是dingo配错了吧,我按照github上的dingo配的没问题

{
  "message": "手机号格式错误",
  "errors": {
    "phone": [
      "手机号格式错误"
    ],
    "password": [
      "密码最少6个字符串"
    ]
  },
  "status_code": 422
}
Admin

@Cai 哈哈,我发现我的情况有点不一样,我是用了l5-repository,所以错误状态被改为了500,直接用laraveldingo应该没啥问题

Admin

@perfectboook 我已经解决了,你将你app\http\requests\request里继承的那个Illuminate\Foundation\Http\FormRequest改为继承Dingo\Api\Http\FormRequest即可

perfectboook

恩,现在运行良好,哈哈。你这个我也试下,在之后的api用下,可以的话,之后有空了改回来,现在好多地方都用我上面那种方法了。项目催的紧,每天晚上两点多睡。。多谢 @Admin @Cai @安正超