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 的自定义错误