在 Laravel 唯一验证 where 子句中检查支持枚举的标量值

问题描述 投票:0回答:1

在带有 PHP 8.1 的 Laravel 9 中,我无法比较 Laravel 验证规则中可以使用 ->where 子句的支持枚举。它需要一个标量值来比较。除了标量值之外,还有其他方法可以与枚举对象进行比较吗?

validator($attributes, [
    'manager_id' =>
        [
            'required',
            'integer',
            Rule::exists(User::getTableName(), 'id'),
            Rule::unique(JProject::getTableName(), 'manager_id')
                ->where('status', JProjectStatus::Active)
        ]
])->validate();

JProjectStatus 是一个支持的枚举

enum JProjectStatus: string
{
    case Active = 'active';
    case Inactive = 'inactive';
    case Blocked = 'blocked';
}

当我尝试检查管理器在项目是否处于活动状态时是否唯一时,我遇到了类型错误,并且我完全理解它正在将 stringenum 对象进行比较。

消息“str_replace():参数 #3 ($subject) 必须是类型 数组|字符串,App\Enums\JProjectStatus 给出“异常”TypeError”

但是如果我像下面这样写,这是一个缩放器值,对于 str_replate() 来说完全没问题。

validator($attributes, [
'manager_id' => 
[
  'required', 
  'integer', 
  Rule::exists(User::getTableName(), 'id'),
  Rule::unique(JProject::getTableName(), 'manager_id')->where('status', JProjectStatus::Active->value)
]

])->validate();

因为现在 'JProjectStatus::Active->value''active'

的标量值

当然,我可以在 where 条件下传递闭包,但想知道最佳实践。我的问题是,这样写可以吗,还是有其他方法可以用枚举对象编写最佳实践。

php enums laravel-9 laravel-validation php-8.1
1个回答
2
投票

是的,有可能,我就是这样使用我的

backed enum

$request->validate([
    'state' => ['required', new Enum(ActiveStatus::class)],
]);

并将此文件导入到控制器中

use Illuminate\Validation\Rules\Enum;

Laravel Enums 仅适用于 PHP-8.1 的 Laravel 9

© www.soinside.com 2019 - 2024. All rights reserved.