Ответ
Начиная с PHP 8.1 и Laravel 8.x, я активно использую типизированные перечисления (Backed Enums), и они приносят несколько ключевых преимуществ в разработке на Laravel:
1. Строгая типизация и безопасность Исключаются "магические строки" и числа. Компилятор и IDE сразу ловят опечатки.
// Раньше
if ($user->status === 'published') { /* ... */ } // Опасно: опечатка 'publised'
// Сейчас с Enum
enum UserStatus: string {
case Draft = 'draft';
case Published = 'published';
}
if ($user->status === UserStatus::Published) { /* ... */ } // Безопасно
2. Прямая интеграция с Eloquent (атрибут-касты) Laravel умеет автоматически преобразовывать значения из БД в объекты Enum и обратно.
// В модели
protected $casts = [
'status' => UserStatus::class,
];
// При работе с моделью
$user = User::find(1);
$user->status; // Объект UserStatus::Published, а не строка 'published'
$user->status = UserStatus::Draft;
$user->save(); // В БД автоматически запишется 'draft'
3. Удобные методы и читаемость У Enum есть встроенные полезные методы.
// Получить все варианты для селекта в форме
$options = UserStatus::cases(); // [UserStatus::Draft, UserStatus::Published]
// Получить скалярное значение
echo UserStatus::Published->value; // 'published'
// Создать Enum из значения (например, из запроса)
$status = UserStatus::from('draft');
$status = UserStatus::tryFrom('invalid'); // Вернет null, а не выбросит исключение
4. Встроенная валидация Laravel предоставляет правило валидации для Enum.
use IlluminateValidationRulesEnum;
$request->validate([
'status' => [new Enum(UserStatus::class)],
]);
5. Возможность добавления методов Enum в PHP — это не просто константы, это полноценные классы.
enum UserStatus: string {
case Draft = 'draft';
case Published = 'published';
public function label(): string {
return match($this) {
self::Draft => 'Черновик',
self::Published => 'Опубликовано',
};
}
}
echo UserStatus::Published->label(); // 'Опубликовано'
В итоге, Enums делают код значительно чище, безопаснее и самодокументируемым, особенно в связке с возможностями фреймворка.