iT邦幫忙

0

[PHP] Laravel 9+ 有效管理下拉選項

  • 分享至 

  • xImage
  •  

引言

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 的應用,無論採用哪種方式,最終目標還是確保程式碼的品質!


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言