Увійти Реєстрація
Блог Серії
Кар'єра
Вакансії Компанії
Навчання
Документація Співбесіди Тестування Відео
Екосистема
Пакети Ресурси Проєкти
Інше
Події Про нас
Посібники 29 липня 2026

State - поведінка залежно від стану

State дозволяє об'єкту змінювати поведінку залежно від внутрішнього стану так, ніби він змінив клас.

Яку проблему вирішує

Об'єкти зі складним життєвим циклом (замовлення, підписка, оплата) обростають розгалуженнями if ($status === ...) у кожному методі. Логіка одного стану розмазана по сервісах, а додавання нового стану зачіпає всі ці місця.

Як вирішує

Кожен стан стає окремим класом із власними правилами. Об'єкт делегує поведінку поточному стану, а той сам вирішує, у який стан перейти далі. Розгалуження if/switch зникають.

interface OrderState
{
  public function pay(Order $order): void;
}

class PendingState implements OrderState
{
  public function pay(Order $order): void
  {
    $order->state = new PaidState();
  }
}

class PaidState implements OrderState
{
  public function pay(Order $order): void
  {
    throw new LogicException('Already paid');
  }
}

class Order
{
  public function __construct(public OrderState $state) {}

  public function pay(): void
  {
    $this->state->pay($this);
  }
}

Де застосовувати

  • Замовлення, підписки, оплати, процеси з чіткими переходами між станами.
  • У Laravel-екосистемі для моделей зручний пакет spatie/laravel-model-states.

Плюси та мінуси

  • + Прибирає каскади if/switch; логіка кожного стану зосереджена в одному класі.
  • + Переходи прозорі - поточний стан сам вирішує, у який наступний перейти.
  • Більше класів і непрямий потік керування.
  • Споріднений зі Strategy, але State ще й керує переходами між собою. Якщо станів два і переходи тривіальні - enum + проста перевірка читабельніші за ієрархію класів.
2

Ця стаття - частина серії

Патерни проєктування

20 / 20

Коментарі

Увійдіть, щоб залишити коментар

Будьте першим, хто залишить коментар!

Читайте також

Прихований N+1 у Livewire: реєстри на час запиту Рекомендовано
Посібники 28 липня 2026
Як будувався laravelukraine.com

Прихований N+1 у Livewire: реєстри на час запиту

Найпідступніше джерело зайвих запитів - список із однаковою кнопкою на кожній картці, де кожна тихо робить свій SELECT. Розбираємо, як per-request реєстр збирає сотні однакових перевірок в один запит, чому саме scoped(), і той самий патерн поза базою.

Вакансії за темою

ConveyThis Нова
Сьогодні

Middle PHP Developer

Middle PHP розробник для SaaS стартапу розробляє та оптимізує веб-додатки на Laravel, SQL/NoSQL, JavaScript та Bootstrap. Вимагається 3+ років досвіду з PHP/Laravel, глибоке розуміння баз даних, навички OOP та чистого коду. Повна віддаленість (часовий пояс Нью-Йорка), робота в швидкому стартап-середовищі з фокусом на масштабованість та якість кода.

PHP Developer

Senior PHP/Laravel розробник для створення та підтримки API-сервісів та систем інтеграції. Основні обов'язки: проектування partner-facing APIs, реалізація механізмів синхронізації даних у реальному часі, робота з REST API та вебхуками. Вимоги: 5+ років досвіду, експертиза PHP/Laravel, глибоке розуміння REST API, досвід з Git/CI-CD та AI-інструментами для розробки.

Digis Нова
Сьогодні

Senior Laravel Developer (EU based)

Розробка та підтримка frontend та backend компонентів хмарної платформи для управління житловим сектором на Vue.js та Laravel. Вимоги: 5+ років PHP/Laravel, 1+ рік Vue.js, англійська B2+. Обов'язки включають розробку функцій, вдосконалення адмін-панелі, виправлення дефектів та підтримку клієнтських імплементацій.

Пакети за темою

Bagisto

bagisto/bagisto

Bagisto — це платформа для електронної комерції, побудована на Laravel. Вона надає готове рішення для створення та управління інтернет-магазинами з підтримкою каталогу товарів, замовлень, платежів та клієнтів.

27,769 v2.4.8 12 15

Lang

laravel-lang/lang

Список 126 мов для Laravel Framework, Laravel Jetstream, Laravel Fortify, Laravel Breeze, Laravel Cashier, Laravel Nova, Laravel Spark та Laravel UI.

7,779 15.33.1 8

Відео за темою