Увійти Реєстрація
Блог Серії
Кар'єра
Вакансії Компанії
Навчання
Документація Співбесіди Тестування Відео
Екосистема
Пакети Ресурси Проєкти Інструменти Події
Інше
Про нас Реклама
Посібники 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 + проста перевірка читабельніші за ієрархію класів.
16

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

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

20 / 34

  1. 1 Abstract Factory - сімейства об'єктів
  2. 2 Builder - поетапна побудова об'єктів
  3. 3 Factory Method - вибір створення
  4. 4 Prototype - швидке клонування
  5. 5 Singleton - один екземпляр
  6. 6 Adapter - узгодження інтерфейсів
  7. 7 Bridge - відокремлення абстракції
  8. 8 Composite - дерево об'єктів
  9. 9 Decorator - middleware як обгортка
  10. 10 Facade - спрощений доступ
  11. 11 Flyweight - спільні легкі об'єкти
  12. 12 Proxy - контроль доступу і кеш
  13. 13 Chain of Responsibility - ланцюжок обробників
  14. 14 Command - інкапсуляція дії
  15. 15 Interpreter - обробка власних правил
  16. 16 Iterator - контроль обходу
  17. 17 Mediator - координація взаємодії
  18. 18 Memento - збереження стану
  19. 19 Observer - реакція на події
  20. 20 State - поведінка залежно від стану
  21. 21 Strategy - вибір поведінки
  22. 22 Template Method - спільний алгоритм
  23. 23 Visitor - операції над структурами
  24. 24 Repository - доступ до даних
  25. 25 Service Layer - бізнес-логіка в одному місці
  26. 26 Dependency Injection - явні залежності
  27. 27 DTO - передача даних без логіки
  28. 28 MVC / MVP / MVVM - архітектурні підходи
  29. 29 CQRS - розділення читання і запису
  30. 30 Event Sourcing - події як джерело істини
  31. 31 Unit of Work - узгоджені зміни
  32. 32 Specification - правила як об'єкти
  33. 33 Pipeline - послідовна обробка
  34. 34 Null Object - поведінка за замовчуванням

Коментарі

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

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

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

Патерн Null Object
Посібники 10 вересня 2026
Патерни проєктування

Null Object - поведінка за замовчуванням

Замінює null безпечним об'єктом із тим самим інтерфейсом і "порожньою" поведінкою. Прибирає перевірки на null - і де він може приховати справжню проблему.

17

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

Middle Backend Engineer PHP/Laravel

Розробка бекенду для нової платформи запису й редагування відео з AI: REST API для керування контентом (S3-завантаження, метадані, мініатюри, планування), оркестрація задач обробки відео на AI-воркерах RunPod, інтеграції з платежами, аналітикою та AI-сервісами, WebSocket-синхронізація з клієнтами та фонові черги. Потрібен досвід із бекенд-фреймворками, проєктуванням баз даних, автентифікацією й безпекою API, роботою з вебхуками та Docker, Git і CI/CD.

Senior/Middle PHP Developer

Підтримка та розвиток великих веб-сайтів компанії (понад 1 млн відвідувань на місяць) на Laravel та OctoberCMS, інтеграція з внутрішніми системами та платіжними шлюзами (Приват24, Portmone, EasyPay, LiqPay), оптимізація продуктивності та робота з великим legacy-кодом без ризику для продакшену. Потрібен досвід PHP від 4 років, впевнена робота з Laravel і OctoberCMS, знання HTML5, CSS3 та JavaScript, вища освіта.

SoftHouseGroup Нова
2 дні тому

PHP Software Engineer

Розробник буде частиною full-stack команди, яка розвиває велику складну систему у страховому домені з багатьма модулями та інтеграціями з платіжними провайдерами. Щодня потрібні розробка нових модулів, підтримка існуючих, виправлення багів та перевірка коду, згенерованого AI. Ключові вимоги: понад 4 роки досвіду PHP, Laravel або Yii2, знання ООП і патернів проєктування, MySQL, REST API, фронтенд (HTML, CSS, JavaScript, jQuery, Vue.js), Git і англійська на рівні Pre-Intermediate для читання.

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

Kalimera

welldigit/kalimera

Interactive installer that scaffolds Laravel applications the Well Digit way.

v1.0.0 15

Bagisto

bagisto/bagisto

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

28,282 v2.5.0 13 26