Коли у вас є кілька статусів для поста і ви хочете, щоб кожен з них мав свій власний колір і іконку, перше, що спадає на думку — це написати 3-5 умовних операторів if-else
у файлах Blade. Такий підхід може бути незручним як з точки зору вигляду коду, так і в разі необхідності його повторного використання в кількох місцях. Але якщо ви хочете трохи спростити логіку, можна використати директиву @class
в Blade, що допомагає, але це ще не найелегантніше рішення. Є насправді ще один, чистіший підхід, який я не використовую часто, але який може бути дуже ефективним — PHP Enums (перелічення). Давайте я вам покажу, як це зробити.
Перед тим як почати, як це буде виглядати без жодних умов?
Найпростіша реалізація виглядатиме так:
$article->status->label(); // Для отримання значення
$article->status->icon(); // Для отримання іконки
$article->status->color(); // Для отримання кольору
Або так:
Тепер ви можете вирішити, де хочете їх розташувати без численних умов.
Тепер давайте почнемо. Спочатку створимо звичайне перелічення (enum) і найкраще вказати тип повернення (наприклад, string
). У переліченні ви визначите свої статуси, такі як active
, inactive
, blocked
, і можете призначити значення для кожного статусу, якщо хочете, хоча це не обов'язково.
Далі створимо метод label
. Цей метод буде використовувати конструкцію match
, щоб повернути назву статусу. Наприклад:
static::ACTIVE => 'Active',
Потім створимо ще один метод, щоб повернути іконку. Це буде схоже на попередній, але поверне саме клас іконки:
static::ACTIVE => 'icon-name',
Нарешті, створимо ще один метод під назвою buttonColor
, який поверне колір кнопки:
static::ACTIVE => 'bg-green-600 hover:bg-green-800',
Ось і основна настройка готова. Останнє, що потрібно зробити, — це зв'язати перелічення з вашим моделлю. Як це зробити?
Це просто: перейдіть до моделі і в методі casts
визначте його ось так:
'status' => StatusArticleEnum::class,
Тепер ви можете звертатися до вашого статусу ось так:
$article->status->label(); // Для отримання значення
$article->status->icon(); // Для отримання іконки
$article->status->color(); // Для отримання кольору
Також, ви можете використати це перелічення валідації ось так:
'status' => ['required', new Enum(StatusArticleEnum::class)],
І це все! Якщо ви не зовсім впевнені, як буде виглядати код, погляньте на приклад зображення в розділі коментарів.
Перекладено з: How can we use Enums to reduce conditions and simplify the code?