【问题标题】:Custom error code for laravel form requestlaravel 表单请求的自定义错误代码
【发布时间】: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

标签: php laravel validation


【解决方案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 的特定消息的验证错误以便其他人提供帮助
    猜你喜欢
    • 1970-01-01
    • 2020-11-26
    • 2020-06-02
    • 2020-06-11
    • 1970-01-01
    • 2017-12-06
    • 2021-09-11
    • 2022-01-15
    • 2020-07-28
    相关资源
    最近更新 更多