laravel 表单请求的自定义错误代码

Posted

技术标签:

【中文标题】laravel 表单请求的自定义错误代码【英文标题】:Custom error code for laravel form request 【发布时间】:2021-04-30 11:38:38 【问题描述】:

我有一个端点,我想像这样发布批量更新请求:


   "resources": [
      
         "id": 5,
         "name": "ABC"
      
   ]

我试图阻止某人更新他们不是其所有者的资源。我可以创建以下规则来防止这种情况:

'resources.*.id' => ['required', 'exists:resources,id,team_id,' . $this->team()->id],

我想自定义错误代码,以便在违反此规则时收到403 错误代码。所有其他规则我对正常的422 错误代码感到满意。

我知道我可以在 messages() 方法中自定义消息。有没有类似的东西,所以我可以返回我自己的错误代码?目前我只是得到标准的422 代码。

我也知道我可以在authorize()方法中加载所有团队资源,但不知道有没有更好的方法?

谢谢。

【问题讨论】:

您是否创建了一个扩展 FormRequest 的单独类,或者您是直接从控制器验证 我正在扩展 FormRequest 【参考方案1】:

也许我来晚了,但希望我的回答仍然可以帮助您或将来的某人。

您可以看到您创建的表单请求验证类扩展自Illuminate\Foundation\Http\FormRequest。然后你看 Laravel Framework 上的源码,有a function to handle failed validation attempts。

所以解决方案,您可以在您创建的表单请求验证类中覆盖默认的failedValidation 函数。这是您可以使用的示例代码:

// ./app/Http/Requests/UpdateFooBarRequest.php

...
use Illuminate\Contracts\Validation\Validator;
use Illuminate\Http\Response;
use Illuminate\Validation\ValidationException;

class UpdateFooBarRequest extends FormRequest

    ...

    /**
     * Handle a failed validation attempt.
     *
     * @param  \Illuminate\Contracts\Validation\Validator  $validator
     * @return void
     *
     * @throws \Illuminate\Validation\ValidationException
     */
    protected function failedValidation(Validator $validator)
    
        throw (new ValidationException($validator))
                    ->errorBag($this->errorBag)
                    ->redirectTo($this->getRedirectUrl())
                    ->status(Response::HTTP_FORBIDDEN);
    

信用:Discussion from Laracasts - How to make a custom FormRequest error response in Laravel 5.5

【讨论】:

【参考方案2】:

如果您正在扩展 FormRequest,那么您可以在消息函数中添加自定义消息,

public function messages() 
    $messages = [];

    foreach ($this->get('resources') as $key => $val) 
        $messages["resources.$key.id.exists"] = "The data :attribute"; // will send 'The data exists'
        $messages["resources.$key.id.required"] = "The data is :attribute";
    

    return $messages;


#Edit:问题的第二部分

如果授权方法返回 false,将自动返回带有 403 状态码的 HTTP 响应,并且您的控制器方法将不会执行。Source

public function authorize()

    return false;

然后它将发送 403 请求而不是 422。

【讨论】:

谢谢,但这会自定义错误代码吗?我想返回 403,而不是标准的 422。 我编辑了我的问题以使其更清楚。我想为 1 个特定规则返回不同的错误代码。当任何资源 id 不属于团队时,我想以 403 错误响应。 如果你想这样,那么你需要像正常或其他一些手动异常类一样处理它,然后在捕获该异常时抛出 403 错误 如果你想我可以给你一个例子,那么上述所有方法都将为空,因此从答案中删除,你还需要详细指定你想要一个带有 403 的特定消息的验证错误以便其他人提供帮助

以上是关于laravel 表单请求的自定义错误代码的主要内容,如果未能解决你的问题,请参考以下文章

如何让 Laravel 返回 JSON REST API 的自定义错误

Alfresco 中的自定义表单新用户错误

当请求 API 的自定义标头错误时,将 http 状态代码设置为 417

Laravel - 多个字段的相同自定义错误消息

Laravel 5表单请求验证返回禁止错误

在 Laravel 5 中使用表单请求验证时如何添加自定义验证规则