高级
枚举小技巧
简介
枚举是特殊的 PHP 类,表示一组固定的常量。它们对于建模可能值数量有限的概念非常有用,例如一周中的几天、一年中的几个月或一副牌的花色。
由于枚举的 “case” 是枚举类的实例,因此向枚举添加接口非常有用。Filament 提供了一系列可添加到枚举的接口,从而提升你的使用体验。
NOTE
在 Eloquent 模型上使用带有属性的枚举时,请确保其转换正确。
枚举标签
HasLabel
接口将枚举实例转换成文本标签。这对于在你的 UI 中展示人类可读的枚举值很有用。
use Filament\Support\Contracts\HasLabel;
enum Status: string implements HasLabel
{
case Draft = 'draft';
case Reviewing = 'reviewing';
case Published = 'published';
case Rejected = 'rejected';
public function getLabel(): ?string
{
return $this->name;
// or
return match ($this) {
self::Draft => 'Draft',
self::Reviewing => 'Reviewing',
self::Published => 'Published',
self::Rejected => 'Rejected',
};
}
}
将枚举标签与表单字段选项结合使用
HasLabel
接口可用于从枚举生成选项数组,其中枚举的值是键,枚举的标签是值。这适用于表单字段,如 Select
和 CheckboxList
,以及表格构建器的 SelectColumn
和 SelectFilter
:
use Filament\Forms\Components\CheckboxList;
use Filament\Forms\Components\Radio;
use Filament\Forms\Components\Select;
use Filament\Tables\Columns\SelectColumn;
use Filament\Tables\Filters\SelectFilter;
Select::make('status')
->options(Status::class)
CheckboxList::make('status')
->options(Status::class)
Radio::make('status')
->options(Status::class)
SelectColumn::make('status')
->options(Status::class)
SelectFilter::make('status')
->options(Status::class)
本例中 Status::class
是实现 HasLabel
的枚举类,选项从这个枚举类中生成:
[
'draft' => 'Draft',
'reviewing' => 'Reviewing',
'published' => 'Published',
'rejected' => 'Rejected',
]
在表格中将枚举标签与文本列结合使用
如果你在表格构造器中使用 TextColumn
,并且在 Eloquent 模型中将其转换为枚举,Filament 将自动使用 HasLabel
接口显示枚举的标签,而不是其原始值。
在表格中使用枚举标签作为分组标题
如果您在表格构造器中使用分组,并且在 Eloquent 模型中将其转换为枚举,Filament 将自动使用 HasLabel
接口显示枚举的标签,而不是其原始值。该标签将显示为每个组的标题。
在信息列表中将枚举标签与文本条目结合使用
如果你在信息列表中使用 TextEntry
,并且在 Eloquent 模型中将其转换为枚举,Filament 将自动使用 HasLabel
接口显示枚举的标签,而不是其原始值。
枚举颜色
HasColor
接口将枚举实例转换为颜色。这对于在 UI 中显示彩色枚举值非常有用。
use Filament\Support\Contracts\HasColor;
enum Status: string implements HasColor
{
case Draft = 'draft';
case Reviewing = 'reviewing';
case Published = 'published';
case Rejected = 'rejected';
public function getColor(): string | array | null
{
return match ($this) {
self::Draft => 'gray',
self::Reviewing => 'warning',
self::Published => 'success',
self::Rejected => 'danger',
};
}
}
在表格中的文本列中使用枚举颜色
如果你在表格构造器中使用了一个 TextColumn
,并且在 Eloquent 模型中将其转换为枚举类型,Filament 会自动使用 HasColor
接口以该枚举标签的颜色来显示。如果你在该列上使用了 badge()
方法,这将效果最佳。
在信息列表的文本条目中使用枚举颜色
如果你在信息列表(infolist)中使用了一个 TextEntry
,并且在 Eloquent 模型中将其转换为枚举类型,Filament 将自动使用 HasColor
接口以该枚举标签的颜色来显示。如果你在条目上使用了 badge()
方法,这将效果最佳。
在表单中使用带有切换按钮字段的枚举颜色
如果你使用了一个 ToggleButtons
表单字段,并且将其选项设置为使用枚举,Filament 将自动使用 HasColor
接口来以该枚举标签的颜色进行显示。
枚举图标
HasIcon
接口将枚举实例转换成图标。这有助于在 UI 中将图标与枚举值一同显示。
use Filament\Support\Contracts\HasIcon;
enum Status: string implements HasIcon
{
case Draft = 'draft';
case Reviewing = 'reviewing';
case Published = 'published';
case Rejected = 'rejected';
public function getIcon(): ?string
{
return match ($this) {
self::Draft => 'heroicon-m-pencil',
self::Reviewing => 'heroicon-m-eye',
self::Published => 'heroicon-m-check',
self::Rejected => 'heroicon-m-x-mark',
};
}
}
在表格中将枚举图标与文本列一起使用
如果你在表格构造器中使用 TextColumn
,并且在 Eloquent 模型中将其转换(cast)成枚举,Filament 将自动使用 HasIcon
接口在其标签旁边显示枚举的图标。如果在列上使用 badge()
方法,则效果最佳。
在信息列表中将枚举图标与文本条目一起使用
如果你在信息列表中使用 TextEntry
,并且在 Eloquent 模型中将其转换(cast)成枚举,Filament 将自动使用 HasIcon
接口在其标签旁边显示枚举的图标。如果在条目上使用 badge()
方法,则效果最佳。
在表单中将枚举图标与切换按钮字段一起使用
如果你使用了 ToggleButtons
表单字段,并且将其设置为使用枚举作为其选项,Filament 将自动使用 HasIcon
接口在标签旁边显示枚举的图标。
枚举描述
HasDescription
接口将枚举实例转换为文本描述,该描述通常显示在其标签下方。这对于在用户界面(UI)中显示人性化的描述非常有用。
use Filament\Support\Contracts\HasDescription;
use Filament\Support\Contracts\HasLabel;
enum Status: string implements HasLabel, HasDescription
{
case Draft = 'draft';
case Reviewing = 'reviewing';
case Published = 'published';
case Rejected = 'rejected';
public function getLabel(): ?string
{
return $this->name;
}
public function getDescription(): ?string
{
return match ($this) {
self::Draft => 'This has not finished being written yet.',
self::Reviewing => 'This is ready for a staff member to read.',
self::Published => 'This has been approved by a staff member and is public on the website.',
self::Rejected => 'A staff member has decided this is not appropriate for the website.',
};
}
}
将枚举描述与表单字段描述结合使用
HasDescription
接口可用于从枚举生成描述数组,其中枚举的值作为键,枚举的描述作为值。这适用于像 Radio
和 CheckboxList
这样的表单字段:
use Filament\Forms\Components\CheckboxList;
use Filament\Forms\Components\Radio;
Radio::make('status')
->options(Status::class)
CheckboxList::make('status')
->options(Status::class)
Edit on GitHubStill need help? Join our Discord community or open a GitHub discussion