开始
概述
Filament 表单构造器允许你在应用中轻松创建动态表单。使用表单构造器,你可以将表单添加到 Livewire 组件。此外,它可以在其他 Filament 包使用,在应用资源、Action 模态框、表格过滤器 等中渲染表单。了解如何创建表单本质就是学习如何使用这些 Filament 包。
本教程将带你一起了解通过 Filament 表单构造器创建表单的基础。如果你计划将新表单添加到自己的 Livewire 组件,你可以先添加完表单,再回来。如果你要将表单添加到应用资源或者其他 Filament 包中,可以开始了!
表单 schema
所有的 Filament 表单都有 "schema"。这是一个数组,其中包含表单字段和布局组件。
表单字段是用户用来填写数据的输入框。比如,HTML 的 <input>
或者 <select>
元素。每个字段都有它们自己的 PHP 类。比如,TextInput
类用于渲染文本输入框字段,Select
类用于渲染下拉列表字段。你可在此处查看可用字段完整清单。
布局组件用于分组字段,并控制他们的展示方式。比如,你可以使用 Grid
组件去并排展示多个字段,或者使用 Wizard
将不同字段分离到多步骤表单中。你可以深度嵌套布局组件,以创建复杂的响应性 UI。你可以在此处查看可用布局组件完整清单。
添加字段到表单 schema
使用 make()
方法初始化字段或布局组件,并使用多字段创建 schema 数组:
use Filament\Forms\Components\RichEditor;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Form;
public function form(Form $form): Form
{
return $form
->schema([
TextInput::make('title'),
TextInput::make('slug'),
RichEditor::make('content'),
]);
}
面板或者其他包中的表单通常默认有两列。对于自定义表单,你可以使用 columns()
方法,完成相同的效果:
$form
->schema([
// ...
])
->columns(2);
现在,RichEditor
只消费可用宽度的一半。我们可以使用 columnSpan()
方法使之占用整个宽度:
use Filament\Forms\Components\RichEditor;
use Filament\Forms\Components\TextInput;
[
TextInput::make('title'),
TextInput::make('slug'),
RichEditor::make('content')
->columnSpan(2), // or `columnSpan('full')`
]
你可以在布局文档中了解更多列和跨度的信息。甚至可以使之以响应式呈现。
添加布局组件到表单 schema
让我们在表单中添加一个新的 Section
。Section
是布局组件,它允许你为一组字段添加标题和描述。也允许内部折叠,用以在长表单中节省空间。
use Filament\Forms\Components\RichEditor;
use Filament\Forms\Components\Section;
use Filament\Forms\Components\TextInput;
[
TextInput::make('title'),
TextInput::make('slug'),
RichEditor::make('content')
->columnSpan(2),
Section::make('Publishing')
->description('Settings for publishing this post.')
->schema([
// ...
]),
]
本例中,你可以看到 Section
组件有它自己的 schema()
方法。你可以在它内部嵌套其他字段及布局组件:
use Filament\Forms\Components\DateTimePicker;
use Filament\Forms\Components\Section;
use Filament\Forms\Components\Select;
Section::make('Publishing')
->description('Settings for publishing this post.')
->schema([
Select::make('status')
->options([
'draft' => 'Draft',
'reviewing' => 'Reviewing',
'published' => 'Published',
]),
DateTimePicker::make('published_at'),
])
该分区(section)现在包含一个 Select
字段和一个 DateTimePicker
字段。你可以在相应文档页面中了解这些字段以及他们的功能。
验证字段
在 Laravel 中,验证规则通常定义在类似于 ['required', 'max:255']
这样的数组中,或者 required|max:255
这样的连接字符串中。如果你只处理后端的简单表单请求,这是可以的。不过 Filament 也可以提供用户前端验证,这样他们可以在发起后端请求前,修正他们的错误。
在 Filament 中,你可以使用注入 required()
和 maxLength()
这样的方法,将验证规则添加到字段中。该方式也优于 Laravel 的验证验证语法,因为 IDE 可以自动补全这些方法:
use Filament\Forms\Components\DateTimePicker;
use Filament\Forms\Components\RichEditor;
use Filament\Forms\Components\Section;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\TextInput;
[
TextInput::make('title')
->required()
->maxLength(255),
TextInput::make('slug')
->required()
->maxLength(255),
RichEditor::make('content')
->columnSpan(2)
->maxLength(65535),
Section::make('Publishing')
->description('Settings for publishing this post.')
->schema([
Select::make('status')
->options([
'draft' => 'Draft',
'reviewing' => 'Reviewing',
'published' => 'Published',
])
->required(),
DateTimePicker::make('published_at'),
]),
]
本例中,有些字段是必须的 required
,有些有 maxLength()
限制。我们有大部分 Laravel 验证规则对应的方法,甚至你可以添加自己的自定义规则。
依赖字段
由于所有 Filament 表单是基于 Livewire 创建的,表单 Schema 是完全动态的。其中有许多可能,此处是一些如何使用以对你有利的例子:
字段可以依据其他字段的值隐藏或者显示。上面的表单中,我们可以 published_at
时间戳字段,直至 status
字段设置成 published
。将闭包传递到 hidden()
方法,可以实现该功能;这将允许你在使用表单时动态隐藏或展示字段。闭包可以访问许多有用的参数,比如 $get
,你可以在此处查看所有参数清单。你所依赖的字段(本例中的 status
)需要设置成 live()
,用来告知表单在每次修改时重载 schema。
use Filament\Forms\Components\DateTimePicker;
use Filament\Forms\Components\Select;
use Filament\Forms\Get;
[
Select::make('status')
->options([
'draft' => 'Draft',
'reviewing' => 'Reviewing',
'published' => 'Published',
])
->required()
->live(),
DateTimePicker::make('published_at')
->hidden(fn (Get $get) => $get('status') !== 'published'),
]