表单构造器
验证
概述
验证规则可以添加到任何字段中。
在 Laravel 中,验证规则通常以数组(如['required', 'max:255'])方式或者组合字符串(如 required|max:255)方式定义。如果你只处理后端的简单表单请求,这是可以的。不过 Filament 也可以提供用户前端验证,这样他们可以在发起后端请求前,修正他们的错误。
Filament 包含多个专用验证方法,不过你也可以使用任何 Laravel 验证规则,包括自定义验证规则。
请注意,有些验证规则依赖于字段名,所以通过
->rule()/->rules()传递时就会失效。可以的话,请使用专用验证方法。
可用规则
Active URL
字段值必须经过 PHP 函数 dns_get_record() 验证返回有效的 A 或 AAAA 记录。(即具有 A 记录的网址)参考 Laravel 文档
Field::make('name')->activeUrl()After (date)
字段值必须在给定日期之后。参考 Laravel 文档
Field::make('start_date')->after('tomorrow')另外,你也可以传入其他字段名作比较:
Field::make('start_date')Field::make('end_date')->after('start_date')After or equal to (date)
字段值必须晚于或者等于给定日期。参考 Laravel 文档
Field::make('start_date')->afterOrEqual('tomorrow')另外,你也可以传入其他字段名作比较:
Field::make('start_date')Field::make('end_date')->afterOrEqual('start_date')Alpha
字段值必须全部由英文字母组成。参考 Laravel 文档
Field::make('name')->alpha()Alpha Dash
字段值可以包含英文字母、数字、中横线(-)或下划线(_)。参考 Laravel 文档
Field::make('name')->alphaDash()Alpha Numeric
字段值必须是英文字母或数字组成。参考 Laravel 文档
Field::make('name')->alphaNum()ASCII
字段值必须是 7 位 ASCII 字符。参考 Laravel 文档
Field::make('name')->ascii()Before (date)
字段值必须在给定日期之前。参考 Laravel 文档
Field::make('start_date')->before('first day of next month')另外,你也可以传入其他字段名作比较:
Field::make('start_date')->before('end_date')Field::make('end_date')Before or equal to (date)
字段值必须早于或者等于给定日期。参考 Laravel 文档
Field::make('start_date')->beforeOrEqual('end of this month')另外,你可以传入其他字段名用作比较:
Field::make('start_date')->beforeOrEqual('end_date')Field::make('end_date')Confirmed
字段值必须与字段 {field}_confirmation 匹配。参考 Laravel 文档
Field::make('password')->confirmed()Field::make('password_confirmation')Different
字段值必须与另一个字段的值不同。参考 Laravel 文档
Field::make('backup_email')->different('email')Doesnt Start With
字段值不能以给定的其中一个值开头。参考 Laravel 文档
Field::make('name')->doesntStartWith(['admin'])Doesnt End With
字段值不能以给定的其中一个值结尾。 参考 Laravel 文档
Field::make('name')->doesntEndWith(['admin'])Ends With
字段值必须以给定的其中一个值开头。参考 Laravel 文档
Field::make('name')->endsWith(['bot'])Enum
给定的字段必须是一个有效的 Enum 值。参考 Laravel 文档
Field::make('status')->enum(MyStatus::class)Exists
字段值必须在数据库中存在。参考 Laravel 文档
Field::make('invitation')->exists()默认情况下,如果表单注册了模型,就会搜索表单模型。你也可以指定一个自定义的表格名或者模型:
use App\Models\Invitation; Field::make('invitation')->exists(table: Invitation::class)默认情况下,表单字段名会被用作搜索字段。你也可以指定一个自定义搜索字段:
Field::make('invitation')->exists(column: 'id')你可以传入闭包到 modifyRuleUsing 参数中,进一步自定义规则:
use Illuminate\Validation\Rules\Exists; Field::make('invitation')    ->exists(modifyRuleUsing: function (Exists $rule) {        return $rule->where('is_active', 1);    })Filled
当字段存在时,字段值不能为空。参考 Laravel 文档
Field::make('name')->filled()Greater than
验证的字段值必须比另一个字段的值大。参考 Laravel 文档
Field::make('newNumber')->gt('oldNumber')Greater than or equal to
验证的字段值必须大于或等于给定字段的值。参考 Laravel 文档
Field::make('newNumber')->gte('oldNumber')Hex color
字段必需是有效的 16 进制颜色。参考 Laravel 文档
Field::make('color')->hexColor()In
验证字段必须包含在给定的值列表中。参考 Laravel 文档
Field::make('status')->in(['pending', 'completed'])Ip Address
字段值必须是 IP 地址。参考 Laravel 文档
Field::make('ip_address')->ip()Field::make('ip_address')->ipv4()Field::make('ip_address')->ipv6()JSON
字段值必须是有效的 JSON 字符串。参考 Laravel 文档
Field::make('ip_address')->json()Less than
验证的字段值必须比另一个字段的值小。参考 Laravel 文档
Field::make('newNumber')->lt('oldNumber')Less than or equal to
验证的字段值必须小于或等于给定字段的值。参考 Laravel 文档
Field::make('newNumber')->lte('oldNumber')Mac Address
字段值必须是 MAC 地址。参考 Laravel 文档
Field::make('mac_address')->macAddress()Multiple Of
字段值必须是给定值的倍数。参考 Laravel 文档
Field::make('number')->multipleOf(2)Not In
验证字段不包含在给定的值列表中 参考 Laravel 文档
Field::make('status')->notIn(['cancelled', 'rejected'])Not Regex
字段值必须不能匹配给定的正则表达式。参考 Laravel 文档
Field::make('email')->notRegex('/^.+$/i')Nullable
字段值可以为空。如果没有使用 required 规则,这个规则会被默认使用。参考 Laravel 文档
Field::make('name')->nullable()Prohibited
字段值必须是空。参考 Laravel 文档
Field::make('name')->prohibited()Prohibited If
只要其他指定字段有任何给定值,该字段就必须为空。参考 Laravel 文档
Field::make('name')->prohibitedIf('field', 'value')Prohibited Unless
除非其他指定字段有任何给定值,否则给字段必须为空。参考 Laravel 文档
Field::make('name')->prohibitedUnless('field', 'value')Prohibits
如果该字段不为空,所有其他指定字段必须为空。参考 Laravel 文档
Field::make('name')->prohibits('field') Field::make('name')->prohibits(['field', 'another_field'])Required
字段值不能为空。参考 Laravel 文档
Field::make('name')->required()Required If
只有在指定字段有给定值时,该字段才不能为空。参考 Laravel 文档。
Field::make('name')->requiredIf('field', 'value')Required If Accepted
只有在其他指定字段等于 "yes"、"on"、 1、 "1"、 true 或 "true" 时,该字段才不能为空。参考 Laravel 文档
Field::make('name')->requiredIfAccepted('field')Required Unless
字段值不能为空,_除非_其他指定字段有给定值。参考 Laravel 文档。
Field::make('name')->requiredUnless('field', 'value')Required With
其他指定的任一字段不为空时,该字段不能为空。参考 Laravel 文档
Field::make('name')->requiredWith('field,another_field')Required With All
只有当其他指定的字段都不为空时,该字段不能为空。参考 Laravel 文档
Field::make('name')->requiredWithAll('field,another_field')Required Without
只有当其他指定的任一字段为空时,该字段不能为空。参考 Laravel 文档
Field::make('name')->requiredWithout('field,another_field')Required Without All
只有当其他指定的字段都为空时,该字段不能为空。参考 Laravel 文档
Field::make('name')->requiredWithoutAll('field,another_field')Regex
字段值必须匹配给定的正则表达式。参考 Laravel 文档
Field::make('email')->regex('/^.+@.+$/i')Same
字段值必须与另一个给定字段的值相同。参考 Laravel 文档
Field::make('password')->same('passwordConfirmation')Starts With
字段值必须以其中一个给定值开始。参考 Laravel 文档
Field::make('name')->startsWith(['a'])String
字段值必须是字符串。参考 Laravel 文档
Field::make('name')->string()Unique
字段值必须在数据库中不存在。参考 Laravel 文档
Field::make('email')->unique()默认情况下,如果表单已经注册了模型,就会去搜索表单模型。你也可以指定自定义的表格名或者模型以供搜索:
use App\Models\User; Field::make('email')->unique(table: User::class)默认情况下,表单字段名会被用作搜索字段。你也可以指定一个自定义搜索字段:
Field::make('email')->unique(column: 'email_address')有时,你想在唯一性(unique)验证时忽略一个给定的模型。比如,"更新个人资料"表单包含了名字、邮箱和地址。你可能会要验证邮箱地址是否唯一。不过,如果用户只修改了名字并未修改邮箱字段,你并不希望因为用户的邮箱地址已经存在而抛出验证错误。
Field::make('email')->unique(ignorable: $ignoredUser)如果你使用了面板构造器,你可以使用 ignoreRecord 参数忽略当前记录:
Field::make('email')->unique(ignoreRecord: true)你也可以传递闭包给 modifyRuleUsing 参数,进一步自定义规则:
use Illuminate\Validation\Rules\Unique; Field::make('email')    ->unique(modifyRuleUsing: function (Unique $rule) {        return $rule->where('is_active', 1);    })ULID
自断必须是一个有效的通用唯一词典可排序标识符(Universally Unique Lexicographically Sortable Identifier) (ULID). 参考 Laravel 文档。
Field::make('identifier')->ulid()UUID
字段必须是有效的 RFC 4122(版本 1、3、4 或 5) UUID。参考 Laravel 文档
Field::make('identifer')->uuid()其他规则
你可以使用 rules() 方法添加其他验证规则:
TextInput::make('slug')->rules(['alpha_dash'])验证规则的完整清单可以在 Laravel 文档中查看。
自定义规则
你可以使用任何自定义规则,正如 Laravel 会使用的自定义规则一样:
TextInput::make('slug')->rules([new Uppercase()])你也可以使用闭包规则
use Closure; TextInput::make('slug')->rules([     fn (): Closure => function (string $attribute, $value, Closure $fail) {        if ($value === 'foo') {            $fail('The :attribute is invalid.');        }    },])你也可以注入 utilities(比如,$get)到自定义规则,比如你需要在表单中用到其他字段:
use Closure;use Filament\Forms\Get; TextInput::make('slug')->rules([    fn (Get $get): Closure => function (string $attribute, $value, Closure $fail) use ($get) {        if ($get('other_field') === 'foo' && $value !== 'bar') {            $fail("The {$attribute} is invalid.");        }    },])验证属性
如果字段验证失败,错误消息中会引用标签名。可以使用 validationAttribute() 方法,自定义错误消息使用的标签名:
use Filament\Forms\Components\TextInput; TextInput::make('name')->validationAttribute('full name')验证消息
默认使用 Laravel 的验证错误消息。要自定义错误消息,请使用 validationMessages() 方法:
use Filament\Forms\Components\TextInput; TextInput::make('email')    ->unique(// ...)    ->validationMessages([        'unique' => 'The :attribute has already been registered.',    ])发送验证通知
如果你想在验证失败时发送通知,可以在 Livewire 组件中使用 onValidationError() 方法:
use Filament\Notifications\Notification;use Illuminate\Validation\ValidationException; protected function onValidationError(ValidationException $exception): void{    Notification::make()        ->title($exception->getMessage())        ->danger()        ->send();}另外,如果你使用了面板构造器并且希望在所有页面中都使用该行为,请在 AppServiceProvider 的 boot() 方法内添加:
use Filament\Notifications\Notification;use Filament\Pages\Page;use Illuminate\Validation\ValidationException; Page::$reportValidationErrorUsing = function (ValidationException $exception) {    Notification::make()        ->title($exception->getMessage())        ->danger()        ->send();};Still need help? Join our Discord community or open a GitHub discussion