--- title: 'laravel 11 以及 較低版本 PHP 的枚舉(ENUM)' tags: '開發學習筆記' --- laravel 11 以及 較低版本 PHP 的枚舉(ENUM) === [TOC] NEW laravel 11 版推出了,針對 PHP 8.1 以上 Enum 的支援 --- :::info 版本需求: PHP 8.2 官方文章: https://laravel.com/docs/11.x/routing#implicit-enum-binding 文件夾路徑: App\Enums ::: ### laravel 指令 ```bash!= php artisan make:enum <class name> ``` ```PHP!= <?php namespace App\Enums; enum Category: string { case Fruits = 'fruits'; case People = 'people'; } ``` ```PHP!= use App\Enums\Category; use Illuminate\Support\Facades\Route; Route::get('/categories/{category}', function (Category $category) { return $category->value; }); ``` PHP 8.1 中的原生枚舉 --- :::info 版本需求: PHP 8.1 ::: PHP 8.1 版本引入了原生的枚舉支持。枚舉是一種特別的類型,可以讓開發者用更安全的方式定義一組固定的值。 ```PHP!= enum StateType: string { case OK = 'ok'; case WARNING = 'warning'; case CRITICAL = 'critical'; /** * 获取所有枚举值 * * @return array */ public static function values(): array { return array_map(fn($case) => $case->value, self::cases()); } } ``` ```PHP!= function isValueInEnum(string $value): bool { return in_array($value, StateType::values(), true); } // 使用函数检查 if (isValueInEnum('ok')) { echo 'Value exists in enum.'; } else { echo 'Value does not exist in enum.'; } ``` >laravel Requeste 验证规则 `Rule::in() `结合 PHP 8.1 枚举的 `values() `方法来进行字段验证。 ```php!= use Illuminate\Validation\Rule; use App\Enum\StateType; $rules = [ 'status' => [ 'nullable', 'numeric', Rule::in(StateType::values()), ], ]; ``` 在較低版本的 PHP 中模擬枚舉 --- 在 PHP 8.1 之前,PHP 沒有原生枚舉支持,所以我通過類來模擬。 :::info 版本需求: PHP 8.1 以下 ::: ```php!= 方法一 這個其實就可以使用了 class StateType { const OK = 'ok'; const WARNING = 'warning'; const CRITICAL = 'critical'; } // 使用改进的模拟枚举 echo StateType::OK(); // 输出:ok ``` PHP 枚舉的優勢簡述 --- - 易於維護:集中統一管理,方便更新和擴展。 - 減少錯誤:限制值範圍,降低 bug 風險,降低出現各種不同的寫法。
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.