Laravel使用API​​验证请求

时间:2016-09-11 18:34:27

标签: php laravel validation

我正在尝试在我的api中实现验证:

public function store(RideUpdateRequest $request)
    {
        $user = JWTAuth::parseToken()->authenticate();

        $ride = Ride::create([
            'user_id'       => $user->id,
            'time'          => $request->time,
            'date'          => $request->date,
            'type_id'       => $request->type_id,
            'location_id'   => $request->location_id,
            'billabletime'  => $request->billabletime
        ]);

        $ride->save();

        return response()->json(['success' => 'Rit succesvol aangemaakt.'], 200);
    }

RideUpdateRequest:

 public function rules()
    {
        return [
            'time'             =>  'required|integer',
            'date'             =>  'required|date',
            'type_id'          =>  'required|integer',
            'location_id'      =>  'required|integer',
            'billabletime'     =>  'required|integer'
        ];
    }

那我怎么能在json中给出一条错误信息(如果请求验证失败)?现在邮递员我什么都收不到?

- 编辑 -

响应:

{
  "billabletime": [
    "The billabletime field is required."
  ]
}

我可以得到这样的东西吗?:

    {
      "error": {
        "The billabletime field is required."
      }
    }

3 个答案:

答案 0 :(得分:2)

如果您查看 FormRequest 类,您会看到response()方法定义为:

public function response(array $errors)
{
    if ($this->expectsJson()) {
        return new JsonResponse($errors, 422);
    }
    ...
}

因此,您可以设置Accept: aplication/json请求标头以符合expectsJson条件,也可以通过在您自己的 RideUpdateRequest <中分离response()方法来强制执行默认响应行为/ strong> class:

public function response(array $errors)
{
    // Always return JSON.
    return response()->json($errors, 422);
}

答案 1 :(得分:1)

  

响应:

{
  "billabletime": [
    "The billabletime field is required."
  ]
}
     

我可以得到这样的东西吗?:

{
  "error": {
    "The billabletime field is required."
  }
}

Laravel使用此格式是因为a)可能有多个字段未通过验证; b)特定字段可能存在多个故障。

例如:

{
  "email": [
    "The email field is invalid."
  ],
  "password": [
    "The password field must contain a number.",
    "The password field must contain a special character."
  ]
}

您的"error": { ... }也是不必要的,因为Laravel的验证系统会在响应时发送422 Unprocessable Entity状态代码。

答案 2 :(得分:0)

在 laravel 8 中,您可以通过覆盖 FormRequest 类中的 failedValidation 函数来控制响应:

use Illuminate\Http\Response;

protected function failedValidation(\Illuminate\Contracts\Validation\Validator $validator)
{
    $response = new Response(['error' => $validator->errors()->first()], 422);
    throw new ValidationException($validator, $response);
}