php 8 引入了 enum 類型,相信有接觸 Java, Python, ...等其他語言的大大們對 enum 並不陌生。這次將利用 enum 更有效的管理下拉選單的選項,提高程式碼的可讀性和可維護性。
以下將示範如何建立一個“性別”的下拉選單,並在 Laravel 9+ 中應用它,充分發揮 PHP 8 的新功能。
使用方法很像定義常數const MALE = 'male'
,把我們需要的選項都列出來。之後如果想要新增選項或是調整值都在這邊設定。
enum Gender: string
{
case MALE = 'male';
case FEMALE = 'female';
case OTHER = 'other';
}
主要有兩塊,分別為列出下拉選項options()
以及顯示已選項目text()
。而resolveEnumClass()
以及trans()
可以根據自己的結構做調整。
options('gender')
取得App\Enums\Gender
裡面所有的 cases 並將它翻譯輸出陣列。text('gender', 'male')
將指定的選項值轉為文字。class DropdownManager
{
public function options(string $enum): array
{
$class = $this->resolveEnumClass($enum);
$enumCases = $class::cases();
$options = array_reduce($enumCases, function ($options, $enumCase) {
Arr::set($options, $enumCase->value, $this->trans($enumCase));
return $options;
}, array());
return $options;
}
public function text(string $enum, mixed $value): string
{
$class = $this->resolveEnumClass($enum);
$enumCase = $class::from($value);
return $this->trans($enumCase);
}
private function resolveEnumClass(string $enum): string
{
return 'App\\Enums\\' . Str::ucfirst($enum);
}
private function trans(mixed $enumCase): string
{
return trans('enums.' . Str::lower($enumCase->name));
}
}
請使用Helper
或是Facade
註冊DropdownManager
,這邊以Facade
註冊並命名為Dropdown
,使用 Laravel Blade 為範例,在新增以及修改頁面顯示下拉選單。
<select name="gender">
@foreach(Dropdown::options('gender') as $optionValue => $optionLabel)
<option value="{{ $optionValue }}">{{ $optionLabel }}</option>
@endforeach
</select>
在查看頁面顯示已選項目。
<p>{{ Dropdown::text('gender', $user->gender) }}</p>
在管理下拉選單的選項時,選擇合適的方法至關重要,而 enum 僅僅是其中之一。根據實際情況和需求來選擇最適合的管理方式。希望本文能幫助您更好地理解 enum 的應用,無論採用哪種方式,最終目標還是確保程式碼的品質!