跳到主要内容
版本:3.x

枚举

概述​

枚举是一种特殊的 PHP 类,用来表示一组固定的常数组。它用于将一些有限数量的可能值的概念模型化,比如星期几、月份或者纸牌的花色。

由于枚举中的 case 是枚举类的实例,在枚举中添加接口会很有用。Filament 提供了一些你可以添加到枚举的接口,用来提升使用枚举时的体验。

当在 Eloquent 模型的属性中使用 Enum,请确保它强制转换正确。

枚举标签​

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 模型中强制转换(casts)成枚举。Filament 将会自动使用 HasLabel 接口展示枚举的标签,而采用非其原始值。

在表格中使用枚举标签作为分组标题​

如果你在表格构造器中使用分组,且其在 Eloquent 模型中强制转换(casts)成了枚举。Filament 将会自动使用 HasLabel 接口展示枚举的标签,而采用非其原始值。这些标签会被展示成每个分组的标题。

在信息列表文本条目中使用枚举标签​

如果你在信息列表中使用了 TextEntry,且其在 Eloquent 模型中强制转换(casts)成枚举。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 模型中强制转换(casts)成枚举。Filament 将会自动使用 HasColor 接口以其颜色展示枚举标签。如果该列使用 badge() 方法则效果最佳。

在信息列表文本栏中使用枚举颜色​

如果你在信息列表中使用了 TextEntry,且其在 Eloquent 模型中强制转换(casts)成枚举。Filament 将会自动使用 HasColor 接口按对应的颜色展示枚举标签。如果该列使用 badge() 方法则效果最佳。

在表单切换按钮组(ToggleButtons)中使用枚举颜色​

如果你在表单构造器中使用 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 模型中强制转换(casts)成枚举。Filament 将会自动使用 HasIcon 接口在枚举标签旁展示枚举图标。如果该列使用 badge() 方法则效果最佳。

在信息列表文本栏中使用枚举图标​

如果你在信息列表中使用了 TextEntry,且其在 Eloquent 模型中强制转换(casts)成枚举。Filament 将会自动使用 HasIcon 接口在枚举标签旁边展示枚举图标。如果该列使用 badge() 方法则效果最佳。

表单切换按钮组(ToggleButtons)中使用枚举图标​

如果你在表单构造器中使用 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)