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

枚举小技巧

简介​

枚举是特殊的 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)