Laravel枚举类验证怎么做

wen PHP项目 2

本文目录导读:

Laravel枚举类验证怎么做

  1. 使用 Laravel 内置的 in 规则(最简单)
  2. 使用第三方包 Brick\Enum 或自定义验证规则
  3. 使用 Laravel 的 Rule::enum (Laravel 10+)
  4. 在 FormRequest 中使用
  5. 支持后端枚举(int 类型)
  6. 使用 Enums Trait(推荐)
  7. 完整示例
  8. 推荐方案

在 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() 方法。

抱歉,评论功能暂时关闭!