Як ми можемо використовувати перелічення (Enums), щоб зменшити кількість умов і спростити код?

pic

Коли у вас є кілька статусів для поста і ви хочете, щоб кожен з них мав свій власний колір і іконку, перше, що спадає на думку — це написати 3-5 умовних операторів if-else у файлах Blade. Такий підхід може бути незручним як з точки зору вигляду коду, так і в разі необхідності його повторного використання в кількох місцях. Але якщо ви хочете трохи спростити логіку, можна використати директиву @class в Blade, що допомагає, але це ще не найелегантніше рішення. Є насправді ще один, чистіший підхід, який я не використовую часто, але який може бути дуже ефективним — PHP Enums (перелічення). Давайте я вам покажу, як це зробити.

Перед тим як почати, як це буде виглядати без жодних умов?

Найпростіша реалізація виглядатиме так:

$article->status->label(); // Для отримання значення  
$article->status->icon(); // Для отримання іконки  
$article->status->color(); // Для отримання кольору

Або так:

pic

Тепер ви можете вирішити, де хочете їх розташувати без численних умов.

Тепер давайте почнемо. Спочатку створимо звичайне перелічення (enum) і найкраще вказати тип повернення (наприклад, string). У переліченні ви визначите свої статуси, такі як active, inactive, blocked, і можете призначити значення для кожного статусу, якщо хочете, хоча це не обов'язково.

pic

Далі створимо метод label. Цей метод буде використовувати конструкцію match, щоб повернути назву статусу. Наприклад:

static::ACTIVE => 'Active',

Потім створимо ще один метод, щоб повернути іконку. Це буде схоже на попередній, але поверне саме клас іконки:

static::ACTIVE => 'icon-name',

Нарешті, створимо ще один метод під назвою buttonColor, який поверне колір кнопки:

static::ACTIVE => 'bg-green-600 hover:bg-green-800',

pic

Ось і основна настройка готова. Останнє, що потрібно зробити, — це зв'язати перелічення з вашим моделлю. Як це зробити?

Це просто: перейдіть до моделі і в методі casts визначте його ось так:

'status' => StatusArticleEnum::class,

pic

Тепер ви можете звертатися до вашого статусу ось так:

$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?

Leave a Reply

Your email address will not be published. Required fields are marked *