返回

Filament 中的文本输入字段:在创建和更新记录时有条件地显示或隐藏

php

在创建时添加文本输入,但在更新时忽略文本输入

作为开发者,我们经常需要在创建新记录和更新现有记录时使用不同的表单字段。例如,我们可能希望在创建用户时要求提供密码,但在更新用户时不强制要求提供密码。

Filament 提供了一种优雅的方式来实现这种行为,使用其 required 选项。

required 选项

required 选项接受一个闭包,该闭包接收当前页面作为参数。在这个闭包中,我们可以检查页面是否为 CreateRecord 实例。如果是,则返回 true 以使字段成为必填项;如果不是,则返回 false 以使字段为非必填项。

use Filament\Pages\Page;

TextInput::make("password")
    ->required(fn (Page $limewire): bool => $limewire instanceof CreateRecord),

在这个示例中,密码字段仅在创建记录时为必填项。在更新记录时,它将不再是必填项。

适用场景

required 选项在处理敏感数据(例如密码)时尤其有用。我们不想在更新记录时提示用户输入密码,因为这可能会危及安全性。

注意

值得注意的是,required 选项仅适用于 TextInputEmailInputPasswordInputTextareaInput 字段。对于其他类型的字段,我们需要使用其他方法来实现所需的逻辑。

目标读者

本文的目标读者是具有中等经验的 Laravel 和 Filament 开发人员,他们希望了解如何根据记录创建与更新操作来有条件地显示或隐藏文本输入字段。

常见问题解答

1. 是否可以在其他类型的字段上使用 required 选项?

否,required 选项仅适用于 TextInputEmailInputPasswordInputTextareaInput 字段。

2. 我可以在表单的 update 方法中使用 required 选项吗?

否,required 选项只能在表单的 create 方法中使用。

3. 如何在更新记录时隐藏密码字段?

你可以使用 hidden 选项在更新记录时隐藏密码字段。

TextInput::make("password")
    ->required(fn (Page $limewire): bool => $limewire instanceof CreateRecord)
    ->hidden(fn (Page $limewire): bool => $limewire instanceof UpdateRecord),

4. 如何在更新记录时使密码字段为非必填项?

你可以使用 required 选项在更新记录时使密码字段为非必填项。

TextInput::make("password")
    ->required(fn (Page $limewire): bool => $limewire instanceof CreateRecord)
    ->required(fn (Page $limewire): bool => false),

5. 是否可以动态地显示或隐藏文本输入字段?

是的,可以使用 JavaScript 或 Alpine.js 根据需要动态地显示或隐藏文本输入字段。