Проверка скалярного значения поддерживаемого перечисления в уникальной проверке Laravel, где предложение
В Laravel 9 с PHP 8.1 я не могу сравнить поддерживаемое перечисление в правилах проверки 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';
}
Когда я пытаюсь проверить, уникален ли менеджер, где проект активен или нет, я столкнулся с ошибкой типа и полностью понимаю, что он сравнивает строку с объектом перечисления .
сообщение "str_replace(): аргумент № 3 ($subject) должен иметь тип array|string, 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"
Конечно, я могу передать закрытие в каком-либо состоянии, но хочу знать наилучшую практику. Мой вопрос: можно ли писать так, или есть ли другой способ написать передовую практику с объектом перечисления.
1 ответ
Да, это возможно, я использую свой
backed enum
этим способом
$request->validate([
'state' => ['required', new Enum(ActiveStatus::class)],
]);
и импортируйте этот файл в контроллер
use Illuminate\Validation\Rules\Enum;
Laravel Enums работает только с Laravel 9 с PHP-8.1.