如何在 laravel api 中显示验证错误,同时将表单请求文件与控制器分开

Jos*_*ray 7 php api laravel

我有一个表单请求文件,与我的控制器分开处理我的验证。在控制器内调用 api 后如何返回验证错误?

//我的控制器

/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function orders(GetOrdersRequest $request, OrderRepository $orderRepository)
{

    $order = $orderRepository->allOrders($request->paginate);

    return $this->sendSuccess('Orders retrieved successfully', $order);
}
Run Code Online (Sandbox Code Playgroud)

Ada*_*dam 16

在 FormRequest 类中有一个函数称为failedValidation

protected function failedValidation(Validator $validator)
{
    throw (new ValidationException($validator))
                ->errorBag($this->errorBag)
                ->redirectTo($this->getRedirectUrl());
}
Run Code Online (Sandbox Code Playgroud)

当您的验证失败时它会触发。对于 API 端点,此请求是一个错误的响应,因为它是重定向并且包含太多信息。要返回干净且轻量级的 json 响应,只需failedValidation在 FormRequest 中编写该函数即可为您的 API 匹配响应。例如这样:

protected function failedValidation(Validator $validator)
{
    $errors = $validator->errors();

    $response = response()->json([
        'message' => 'Invalid data send',
        'details' => $errors->messages(),
    ], 422);

    throw new HttpResponseException($response);
}
Run Code Online (Sandbox Code Playgroud)

归功于/sf/answers/3970877361/


小智 6

您将无法以这种方式获取错误,因为如果存在验证错误,FormRequest 将在请求到达控制器之前抛出异常。但是,您可以自行捕获表单请求中的错误,并使用以下failedValidation方法修改响应

use Illuminate\Contracts\Validation\Validator;
use Illuminate\Foundation\Http\FormRequest;

class OrderRequest extends FormRequest
{
    public function authorize()
    {
        //
    }

    public function rules()
    {
        //
    }

    public function failedValidation(Validator $validator)
    {
        $errors = $validator->errors(); // Here is your array of errors
        throw new HttpResponseException($errors);
    }
}
Run Code Online (Sandbox Code Playgroud)


Erk*_*kök 4

当验证失败时, Laravel 请求类会自动返回。您应该在视图(刀片)文件中显示错误消息。您可以按照官方文档进行操作。

对于 API,它会自动返回包含错误消息的 JSON 响应。

基本上你可以在blade文件中做到这一点:

@if($errors->has('email'))
    <span class="error">{{ $errors->get('email') }}</span>
@endif
Run Code Online (Sandbox Code Playgroud)

  • “Accept:application/json”将此标头添加到邮递员作为标头。前端框架使用ajax,因此不需要添加此标头。但是当你尝试使用邮递员时你应该添加。 (12认同)
  • 谢谢,但我不使用刀片。我正在实现将由前端框架使用的 api。 (2认同)