枚举
概述
枚举是一种特殊的 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',
};
}
}