与列无关的 Laravel 验证放在哪里

Where to put Laravel validation that is not related to column

例如,我有一个处理某些实体创建的 HTTP 请求(让它成为角色) 验证看起来像这样:

class CreateRole extends FormRequest
{
    public function rules()
    {
        return [
            'name' => 'required|string|max:255',
            'permissions' => ['required', 'array'],
...

而且我有一些与名称或权限列无关的限制。 例如,可以创建的最大角色数量。

这样的自定义验证可以放在name属性,但是看起来不对。

PS:我知道自定义验证器。关于放在哪里的问题...

您可以在表单请求中使用 after hook CreateRole.php

class CreateRole extends FormRequest
{    
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array<string, mixed>
     */
    public function rules()
    {
        return [
            'title'  => ['required', 'string', 'max:255'],
            'permissions' => ['required', 'array'],
        ];
    }
    /**
     * Configure the validator instance.
     *
     * @param  \Illuminate\Validation\Validator  $validator
     * @return void
     */
    public function withValidator($validator)
    {
        $validator->after(function ($validator) {
            if (Role::count() > 10) {
                $validator->errors()->add('limit', 'Max number of Roles reached!');
            }
        });
    }
}

您必须创建自定义验证 class,如此 Laravel document 所示,然后将其放入您的验证 class 中,如下所示。

 'name' => ['required', 'string', new CustomValidationClass],