Filament Checkbox 组件指南:Blade 复选框、布尔状态与校验错误样式
【免费下载链接】filamentA powerful open-source UI framework for Laravel • Build and ship apps & admin panels fast with Livewire项目地址: https://gitcode.com/GitHub_Trending/fi/filament
本文以 Filament 开源仓库中的 Blade Checkbox 组件文档 为主体,系统讲解如何在 Laravel Blade 视图中通过x-filament::input.checkbox渲染布尔复选框,并通过 Blade 属性或 Alpine.js 表达式触发校验错误样式。读完本文,你将掌握该组件的全部核心用法、错误状态的两种触发机制,以及其底层视图与样式实现原理,可直接复用于自定义表单、行内编辑或页面级布尔开关场景。
组件概览:一个用于布尔值的输入组件
x-filament::input.checkbox是 Filament 提供的底层输入组件,专门用于渲染可切换布尔值(true/false)的复选框。它属于支持包(support package)中的输入组件家族,与x-filament::input、x-filament::input.radio、x-filament::input.select等并列,视图文件位于 packages/support/resources/views/components/input/checkbox.blade.php。
它通常与 Livewire 的wire:model指令配合使用,将复选框状态直接绑定到 Livewire 组件属性上。最基础的用法如下:
<label> <x-filament::input.checkbox wire:model="isAdmin" /> <span> Is Admin </span> </label>这个组件只负责渲染一个带有 Filament 主题样式的<input type="checkbox">,标签(label)文本需要由你自行用<label>与<span>包裹提供——这种设计让它比表单字段(Form Field)更轻量、更可控,适合在自定义视图、行内编辑或其他组件中直接嵌入。
与表单版 Checkbox 字段的区别
需要区分的是,仓库中还存在一个表单字段版的Checkbox类(packages/forms/src/Components/Checkbox.php),它用于在 Filament 表单 Schema 中声明字段:
use Filament\Forms\Components\Checkbox; Checkbox::make('is_admin')表单版与 Blade 组件版是"高层封装"与"底层原语"的关系:表单字段版内部同样渲染出带fi-checkbox-input样式的复选框,并额外提供默认值、校验规则、状态绑定、行内/堆叠布局等能力。如果你在构建的是 Filament 资源(Resource)或表单页面,应优先使用表单字段版;本文接下来聚焦的 Blade 组件版,则适合在自定义 Blade 视图中直接取用。
布尔状态的两个底层保障
从源码看,表单版Checkbox在setUp()中做了两件关键事(Checkbox.php):
$this->default(false):未勾选时默认值为false,保证状态始终是明确的布尔值;$this->rule('boolean'):内置boolean校验规则,确保提交值必须是布尔类型。
此外,它注册了一个BooleanStateCast状态转换器(Checkbox.php),将表单输入统一转换为bool(非空即true)。这解释了为什么 Filament 复选框不会出现"0 / 1 / null"混乱的问题。若使用 Eloquent 模型保存布尔字段,官方文档建议同时在模型上声明boolean类型转换(见 表单版 Checkbox 文档)。
触发复选框的错误状态(Error State)
复选框的勾选状态本身只有两种,但"是否通过校验"是独立于勾选状态的第三种信息。Filament 为此设计了专门的样式钩子:当复选框处于无效状态时,会应用危险色(danger)主题,边框与选中色都变为红色(详见下文样式源码)。
触发错误状态有两种途径:Blade 属性与Alpine.js 表达式。两者最终都只会影响 CSS 类fi-valid/fi-invalid的切换,不会改变复选框的交互行为。
方式一:通过 Blade 的valid属性触发
在服务端渲染场景(如表单提交后重载页面),你可以在组件上传递valid属性,传入一个布尔表达式,表示当前复选框是否有效:
<x-filament::input.checkbox wire:model="isAdmin" :valid="! $errors->has('isAdmin')" />这里的:valid="..."是 Blade 的属性绑定语法(冒号前缀),会把右侧表达式的结果作为valid属性的值传给组件。示例中当校验错误包($errors)里含有isAdmin字段的错误时,valid为false,复选框随即呈现错误态样式。
方式二:通过 Alpine.js 的alpine-valid属性触发
在纯前端驱动的场景(如 Alpine 组件内部、无需服务端重载),可以改用alpine-valid属性,传入一个Alpine 表达式,组件会在运行时根据表达式结果实时切换错误态样式:
<div x-data="{ errors: ['isAdmin'] }"> <x-filament::input.checkbox x-model="isAdmin" alpine-valid="! errors.includes('isAdmin')" /> </div>示例中,alpine-valid接收! errors.includes('isAdmin'):当错误数组包含isAdmin时表达式为false,复选框即时进入无效态。由于绑定是响应式的,errors数组的任何变化都会立刻反映到样式上——例如校验通过后错误被清除,红色样式会自动消失。
两种方式的取舍
| 触发方式 | 属性名 | 适用场景 | 计算时机 |
|---|---|---|---|
| Blade | valid | 服务端渲染、表单重载后根据$errors判断 | 每次渲染时求值 |
| Alpine.js | alpine-valid | 前端交互、SPA 式体验,需响应式切换 | 运行时响应式求值 |
两者可以同时使用,但需要注意的是:一旦提供了alpine-valid,组件将优先采用 Alpine 动态绑定样式(详见下文视图源码逻辑),此时valid属性不再参与样式计算。
深入底层:视图与样式如何实现错误态
组件视图的 props 与渲染逻辑
x-filament::input.checkbox的完整实现非常精简(checkbox.blade.php),核心逻辑如下:
@props([ 'alpineValid' => null, 'valid' => true, ]) @php $hasAlpineValidClasses = filled($alpineValid); @endphp <input type="checkbox" @if ($hasAlpineValidClasses) x-bind:class="{ 'fi-valid': {{ $alpineValid }}, 'fi-invalid': {{ "(! {$alpineValid})" }}, }" @endif {{ $attributes ->class([ 'fi-checkbox-input', 'fi-valid' => (! $hasAlpineValidClasses) && $valid, 'fi-invalid' => (! $hasAlpineValidClasses) && (! $valid), ]) }} />从中可以看出:
valid的默认值是true:不传任何属性时,复选框默认呈有效态;alpineValid的默认值是null:filled($alpineValid)判断其是否为空,从而决定走哪条分支;- 优先级规则:只要
alpine-valid非空,就使用x-bind:class动态绑定fi-valid/fi-invalid两个类(表达式为真则加fi-valid,为假则加fi-invalid),并完全忽略 Blade 的valid属性; - 兜底逻辑:没有
alpine-valid时,才根据 Blade 的valid值静态输出对应 CSS 类。
这种"属性优先、各司其职"的设计,让同一份视图既能服务传统服务端渲染,又能无缝嵌入 Alpine 响应式组件。
错误态的样式定义
错误态的视觉呈现由 packages/support/resources/css/components/input/checkbox.css 定义。复选框基础样式使用 Tailwind 工具类构建:默认尺寸size-4、圆角、白底灰环;勾选态通过内联 SVG 绘制白色对勾;同时支持:indeterminate(半选)状态,绘制一条横线。
当叠加fi-invalid类时,主题色从 primary(品牌主色)切换为 danger(危险色):
input[type='checkbox'].fi-checkbox-input { @apply text-primary-600 checked:bg-primary-600 focus:ring-primary-600 /* ... 基础样式 ... */; } input[type='checkbox'].fi-checkbox-input.fi-invalid { @apply text-danger-600 checked:bg-danger-600 ring-danger-600 focus:ring-danger-600 /* ... 危险色覆盖 ... */; }也就是说,无效态的复选框边框、选中背景、聚焦光环都会变为红色系,半选(indeterminate)状态同样有对应的 danger 色变体。任何需要展示"该复选框未通过校验"的界面,都可以直接复用这套机制,而不必自行编写样式。
配套能力:复选框的校验规则
虽然 Blade 组件本身不承载校验逻辑,但理解 Filament 为复选框内置的校验规则,有助于你在封装表单字段时正确使用它。表单版Checkbox字段支持两种专属规则(CanBeAccepted):
accepted():确保复选框必须被勾选,典型场景是"同意服务条款":
use Filament\Forms\Components\Checkbox; Checkbox::make('terms_of_service') ->accepted()declined():确保复选框必须未被勾选:
use Filament\Forms\Components\Checkbox; Checkbox::make('is_under_18') ->declined()两个方法都支持传入布尔值或闭包来动态决定规则是否生效,例如->accepted(FeatureFlag::active())。完整的规则列表可参考 表单校验文档。
实战组合建议
综合以上内容,一个典型的完整用法是:在 Filament 表单字段中声明并校验复选框,在自定义 Blade 视图中用底层组件渲染并展示错误态。
例如在表单字段中声明"接受服务条款"并强制勾选:
use Filament\Forms\Components\Checkbox; Checkbox::make('terms_of_service') ->accepted() ->required()而在自定义视图(如表单页面底部的协议确认区)中,用底层 Blade 组件配合$errors展示错误态:
<label> <x-filament::input.checkbox wire:model="termsOfService" :valid="! $errors->has('termsOfService')" /> <span> I accept the terms of service </span> </label> @error('termsOfService') <p class="text-sm text-danger-600">{{ $message }}</p> @enderror如果希望校验结果实时反馈(例如用户勾选后错误立即消失),则改用alpine-valid配合响应式错误集合,获得即时样式切换的前端体验。
小结
Filament 的x-filament::input.checkbox组件以极小的 API 表面积提供了完整的能力:通过wire:model绑定布尔状态,通过valid或alpine-valid呈现校验错误态,底层则由统一的fi-checkbox-input+fi-valid/fi-invalid样式体系驱动。理解它的 props 优先级(alpine-valid优先于valid)与样式钩子,你就能在自定义界面中与 Filament 的表单校验体系无缝衔接。更多输入类组件(如文本框、下拉选择)的用法可继续阅读 Input 组件文档 与 Input Wrapper 文档。
【免费下载链接】filamentA powerful open-source UI framework for Laravel • Build and ship apps & admin panels fast with Livewire项目地址: https://gitcode.com/GitHub_Trending/fi/filament
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考