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

问题描述 投票:0回答:7

我有一个表单请求文件,与我的控制器分开处理我的验证。在控制器内调用 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);
}
php laravel api
7个回答
16
投票

在FormRequest类中有一个函数叫做

failedValidation
:

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

当您的验证失败时它会触发。对于 API 端点,此请求是一个错误的响应,因为它是重定向并且包含太多信息。归还一个干净、 轻量级 json 响应,只需在 FormRequest 中编写函数

failedValidation
即可为您的 API 提供匹配的响应。例如这样:

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

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

    throw new HttpResponseException($response);
}

感谢https://stackoverflow.com/a/56726819/2311074


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);
    }
}

3
投票

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

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

基本上你可以在刀片文件中完成:

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

1
投票

只需将

accept: application/json
添加到邮递员或任何用于 API 测试目的的标题中即可。


0
投票

我认为这是不可能的,但您可以在 FormRequest 中使用prepareForValidation() 方法并在验证之前操作数据。


0
投票

即使使用表单请求,Laravel 也会自动为您处理验证,而无需您执行任何操作。验证失败时,将返回一个

errors
,您可以在请求响应中访问它。
response.data.errors
(当然,取决于您用于请求的库)将包含错误。例如:

errors: {
    name: ["The name must be at least 2 characters"]
}

这只是一个虚拟示例。 通过强制请求失败来进行快速测试,然后控制台记录响应以查看它将如何显示。


0
投票

将消息功能添加到您的请求验证文件中。在 Laravel 11 上测试。

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

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

    public function rules()
    {
          return [
            'email' => ['required', 'email', 'max:254']
          ]
    }

    public function messages()
    {
        return [
            'email.required' => "Please enter email",
        ];
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.