在许多情况下,您可能会觉得这是必需的。
假设您正在尝试为项目构建 REST api。并且您已决定更新请求方法不会对请求中的任何字段进行任何必需的规则验证(因为可能有很多参数并且您不希望仅仅为了更改一列而将它们全部传递,或者您可能没有所有列,因为您无权访问它)。
那么您将如何在 UpdatePostRequest.php 类中处理此验证,您已将所有验证规则放入代码中给出的 rules() 方法中。
此外,可能要求两个或多个请求字段的值之和应大于或小于某个阈值数量。然后呢?
我同意你可以在控制器中检查它并从那里重定向它,但如果我们要在控制器中进行这些检查,它不会破坏创建专用请求类的目的。
我觉得控制器应该是干净的,不应该有多个基于验证的退出点。这些小的验证检查可以通过创建新规则或扩展您自己的自定义验证或创建验证后挂钩在请求类本身中处理,所有这些在 Laravel 中都有其独特的用法。
因此,您可能想要在这里做的是创建一个验证钩子,分配它的地方是检查请求是否为空,就像下面给出的示例一样
public function withValidator($validator)
{
$validator->after(function ($validator) {
if (empty($this->toArray())) {
$validator->errors()->add('body', 'Request body cannot be empty');
}
if (!$this->validateCaptcha()) {
$validator->errors()->add('g-recaptcha-response', 'invalid');
}
});
}
这是它的完整示例。
<?php
namespace App\Http\Requests\Posts;
use App\Helpers\General\Tables;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;
class UpdatePostRequest extends FormRequest
{
public function authorize()
{
return auth()->user()->can('update-post', $this);
}
public function rules()
{
return [
'name' => ['string', 'min:3', 'max:255'],
'email' => ['string', 'email', 'min:3', 'max:255'],
'post_data' => ['string', 'min:3', 'max:255'],
];
}
public function withValidator($validator)
{
$validator->after(function ($validator) {
if (empty($this->toArray())) {
$validator->errors()->add('body', 'Request body cannot be empty');
}
});
}
}
谢谢..