本文目录导读:

- 使用 Laravel 内置的
in规则(最简单) - 使用第三方包
Brick\Enum或自定义验证规则 - 使用 Laravel 的
Rule::enum(Laravel 10+) - 在 FormRequest 中使用
- 支持后端枚举(int 类型)
- 使用
EnumsTrait(推荐) - 完整示例
- 推荐方案
在 Laravel 中验证枚举类有多种方法,以下是几种常用的实现方式:
使用 Laravel 内置的 in 规则(最简单)
use App\Enums\UserStatus;
use Illuminate\Validation\Rule;
$request->validate([
'status' => ['required', Rule::in(UserStatus::values())],
]);
需要在枚举类中定义 values() 方法:
<?php
namespace App\Enums;
enum UserStatus: string
{
case Active = 'active';
case Inactive = 'inactive';
case Banned = 'banned';
public static function values(): array
{
return array_column(self::cases(), 'value');
}
}
使用第三方包 Brick\Enum 或自定义验证规则
创建自定义验证规则
php artisan make:rule EnumRule
<?php
namespace App\Rules;
use Closure;
use Illuminate\Contracts\Validation\ValidationRule;
class EnumRule implements ValidationRule
{
private string $enumClass;
public function __construct(string $enumClass)
{
$this->enumClass = $enumClass;
}
public function validate(string $attribute, mixed $value, Closure $fail): void
{
if (!$this->enumClass::tryFrom($value)) {
$fail('选择的 :attribute 无效。');
}
}
}
使用示例:
use App\Enums\UserStatus;
use App\Rules\EnumRule;
$request->validate([
'status' => ['required', new EnumRule(UserStatus::class)],
]);
使用 Laravel 的 Rule::enum (Laravel 10+)
Laravel 10 引入了内置的枚举规则:
use App\Enums\UserStatus;
use Illuminate\Validation\Rule;
$request->validate([
'status' => ['required', Rule::enum(UserStatus::class)],
]);
在 FormRequest 中使用
<?php
namespace App\Http\Requests;
use App\Enums\UserStatus;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;
class UpdateUserRequest extends FormRequest
{
public function rules(): array
{
return [
'status' => ['required', Rule::enum(UserStatus::class)],
];
}
}
支持后端枚举(int 类型)
<?php
namespace App\Enums;
enum UserRole: int
{
case Admin = 1;
case Editor = 2;
case Viewer = 3;
public static function values(): array
{
return array_column(self::cases(), 'value');
}
}
验证时:
use App\Enums\UserRole;
use Illuminate\Validation\Rule;
$request->validate([
'role' => ['required', 'integer', Rule::in(UserRole::values())],
]);
使用 Enums Trait(推荐)
创建一个 Trait 来复用枚举验证逻辑:
<?php
namespace App\Traits;
trait HasEnumValidation
{
public static function validationRule(): string
{
$cases = implode(',', self::values());
return "in:{$cases}";
}
public static function values(): array
{
return array_column(self::cases(), 'value');
}
}
在枚举类中使用:
<?php
namespace App\Enums;
use App\Traits\HasEnumValidation;
enum UserStatus: string
{
use HasEnumValidation;
case Active = 'active';
case Inactive = 'inactive';
case Banned = 'banned';
}
验证时:
$request->validate([
'status' => ['required', UserStatus::validationRule()],
]);
完整示例
<?php
namespace App\Http\Controllers;
use App\Enums\UserStatus;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Validation\Rule;
class UserController extends Controller
{
public function update(Request $request, User $user)
{
$validated = $request->validate([
'name' => 'required|string|max:255',
'email' => 'required|email|unique:users,email,' . $user->id,
'status' => ['required', Rule::enum(UserStatus::class)],
]);
$user->update($validated);
return redirect()->back()->with('success', '用户更新成功');
}
}
推荐方案
对于 Laravel 10+,推荐使用内置的 Rule::enum() 方法,它是最简洁和符合 Laravel 风格的验证方式,对于 Laravel 10 以下版本,建议使用自定义验证规则或 Rule::in() 方法。