本文目录导读:

- 使用 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() 方法。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播