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