在带有 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';
}
当我尝试检查管理器在项目是否处于活动状态时是否唯一时,我遇到了类型错误,并且我完全理解它正在将 string 与 enum 对象进行比较。
消息“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 条件下传递闭包,但想知道最佳实践。我的问题是,这样写可以吗,还是有其他方法可以用枚举对象编写最佳实践。
是的,有可能,我就是这样使用我的
backed enum
$request->validate([
'state' => ['required', new Enum(ActiveStatus::class)],
]);
并将此文件导入到控制器中
use Illuminate\Validation\Rules\Enum;
Laravel Enums 仅适用于 PHP-8.1 的 Laravel 9