PHPackages                             sbooker/workflow - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. sbooker/workflow

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

sbooker/workflow
================

Simple workflow for FSM implementation

2.0.0(2y ago)06.1k11MITPHPPHP ^8.1

Since Jun 3Pushed 8mo ago1 watchersCompare

[ Source](https://github.com/sbooker/workflow)[ Packagist](https://packagist.org/packages/sbooker/workflow)[ RSS](/packages/sbooker-workflow/feed)WikiDiscussions master Synced 5d ago

READMEChangelog (1)Dependencies (2)Versions (7)Used By (1)

[Read in English](README.EN.MD)

Workflow (`sbooker/workflow`)
=============================

[](#workflow-sbookerworkflow)

[![Latest Version](https://camo.githubusercontent.com/7f7da5ebe71b52f0058140ccdc07b4ae4265d185be2aca908c147191ccc14e49/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f73626f6f6b65722f776f726b666c6f772e7376673f7374796c653d666c61742d737175617265)](https://img.shields.io/packagist/v/sbooker/workflow)[![Software License](https://camo.githubusercontent.com/55c0218c8f8009f06ad4ddae837ddd05301481fcf0dff8e0ed9dadda8780713e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d627269676874677265656e2e7376673f7374796c653d666c61742d737175617265)](https://github.com/sbooker/workflow/blob/master/LICENSE)[![PHP Version](https://camo.githubusercontent.com/247427bbae9e0e03d48e6f46f496536d832fb6e34aebe4e8064f950de4c05333/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f7068702d762f73626f6f6b65722f776f726b666c6f772e7376673f7374796c653d666c61742d737175617265)](https://php.net)[![Total Downloads](https://camo.githubusercontent.com/71e0f0bd366bfb068b74828d39812359ff94fd7c13dc4da314c6e4f795345c4d/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f73626f6f6b65722f776f726b666c6f772e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/sbooker/workflow)

Простая, но строгая реализация паттерна "Конечный автомат" (State Machine) для доменных объектов и не только.

Назначение библиотеки
---------------------

[](#назначение-библиотеки)

Во многих приложениях состояние объекта (статус заказа, заявки, документа) — это просто поле в базе данных. Логика, разрешающая или запрещающая смену статуса, часто разбросана по разным частям кода, что приводит к ошибкам и усложняет поддержку.

Эта библиотека решает проблему, **формализуя управление жизненным циклом объекта**. Она заставляет вас явно определить:

1. Все возможные **состояния** (статусы), в которых может находиться объект.
2. Все разрешенные **переходы** между этими состояниями.

Логика переходов инкапсулируется внутри самого объекта, что делает его поведение предсказуемым и надежным.

Ключевые особенности
--------------------

[](#ключевые-особенности)

- **Явное определение переходов:** Карта переходов (`TransitionMap`) — единственный источник правды о жизненном цикле объекта.
- **Инкапсуляция логики:** Объект сам отвечает за смену своих состояний.
- **Надежные статусы-объекты:** Построена на [litgroup/enumerable](https://github.com/LitGroup/enumerable.php), что позволяет создавать типобезопасные и легко сохраняемые в БД статусы.
- **Эффективные структуры данных:** Использует `Ds\Map` и `Ds\Set` для удобного и типобезопасного определения карты переходов (объект статуса -&gt; набор объектов статусов). Работает 'из коробки' с PHP-реализацией (polyfill), но для максимальной производительности рекомендуется C-расширение `ds`.
- **Защита от невалидных состояний:** Попытка выполнить недопустимый переход приведет к контролируемой ошибке `FlowError`.

Установка
---------

[](#установка)

```
composer require sbooker/workflow
composer require litgroup/enumerable
composer require php-ds/php-ds
```

Библиотека зависит от пакета `php-ds/php-ds`, который предоставляет структуры данных `Map` и `Set`. По умолчанию используется PHP-реализация (polyfill), которой достаточно для большинства сценариев.

**Для максимальной производительности (опционально)** вы можете дополнительно установить C-расширение:

```
pecl install ds
```

Быстрый старт
-------------

[](#быстрый-старт)

Рассмотрим пример управления жизненным циклом Заказа (`Order`).

### Шаг 1: Определите Статусы

[](#шаг-1-определите-статусы)

Создайте класс статуса, унаследовав его от `Sbooker\Workflow\Status`.

```
// src/Orders/Domain/Status.php
namespace App\Orders\Domain;

use Sbooker\Workflow\Status as BaseStatus;

final class Status extends BaseStatus
{
    private const NEW = 'new';
    private const PAID = 'paid';
    private const SENT = 'sent';

    public static function new(): self
    {
        return new self(self::NEW);
    }

    public static function paid(): self
    {
        return new self(self::PAID);
    }

    public static function sent(): self
    {
        return new self(self::SENT);
    }
}
```

### Шаг 2: Создайте класс Workflow

[](#шаг-2-создайте-класс-workflow)

Унаследуйте свой класс от `Sbooker\Workflow\Workflow` и реализуйте два абстрактных метода.

```
// src/Orders/Domain/OrderWorkflow.php
namespace App\Orders\Domain;

use Sbooker\Workflow\Workflow;
use Ds\Map;
use Ds\Set;

final class OrderWorkflow extends Workflow
{
    public function __construct()
    {
        // Начальный статус - неотъемлемая часть определения этого жизненного цикла.
        parent::__construct(Status::new());
    }

    protected function getStatusClass(): string
    {
        return Status::class;
    }

    protected function buildTransitionMap(): Map
    {
        $map = new Map();

        // Используем put() для добавления переходов с объектами в качестве ключей
        $map->put(Status::new(), new Set([ Status::paid() ]));
        $map->put(Status::paid(), new Set([ Status::sent() ]));

        return $map;
    }
}
```

### Шаг 3: Интегрируйте Workflow в ваш Агрегат

[](#шаг-3-интегрируйте-workflow-в-ваш-агрегат)

Ваш доменный объект просто создает экземпляр Workflow, не зная ничего о его начальном состоянии и правилах его изменения.

```
// src/Orders/Domain/Order.php
namespace App\Orders\Domain;

final class Order
{
    private OrderWorkflow $workflow;

    public function __construct()
    {
        $this->workflow = new OrderWorkflow();
    }

    public function pay(): void
    {
        $this->workflow->transitTo(Status::paid());
    }

    public function getStatus(): Status
    {
        return $this->workflow->getStatus();
    }
}
```

### Шаг 4: Используйте в прикладном коде

[](#шаг-4-используйте-в-прикладном-коде)

```
// src/UseCase/PayOrder/Handler.php
use Sbooker\Workflow\FlowError;

$order = $orderRepository->get($orderId); // Заказ в статусе 'NEW'

try {
    $order->pay(); // Успешно! Статус изменится на 'PAID'

    // Эта строка вызовет исключение FlowError
    $order->pay();

} catch (FlowError $e) {
    // Обрабатываем ошибку бизнес-логики
    $this->logger->error("Invalid status transition: " . $e->getMessage());
}
```

License
-------

[](#license)

See [LICENSE](https://github.com/sbooker/workflow/blob/master/LICENSE) file.

###  Health Score

39

—

LowBetter than 86% of packages

Maintenance42

Moderate activity, may be stable

Popularity22

Limited adoption so far

Community10

Small or concentrated contributor base

Maturity68

Established project with proven stability

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~368 days

Total

4

Last Release

1068d ago

Major Versions

0.9.0 → 1.1.02021-02-02

1.1.0 → 2.0.02023-06-14

PHP version history (4 changes)1.0.0PHP ^7.4

0.9.0PHP ^7.1

1.1.0PHP ^7.4 || ^8.0

2.0.0PHP ^8.1

### Community

Maintainers

![](https://www.gravatar.com/avatar/f97b1f6ea03776dda6e0ec26d1ff3a3309972d65bd1376eb111c2b35017af339?d=identicon)[sbooker](/maintainers/sbooker)

---

Top Contributors

[![sbooker](https://avatars.githubusercontent.com/u/3658174?v=4)](https://github.com/sbooker "sbooker (6 commits)")

---

Tags

workflowfsmstate-machine

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/sbooker-workflow/health.svg)

```
[![Health](https://phpackages.com/badges/sbooker-workflow/health.svg)](https://phpackages.com/packages/sbooker-workflow)
```

###  Alternatives

[symfony/workflow

Provides tools for managing a workflow or finite state machine

62842.3M170](/packages/symfony-workflow)[shrink0r/workflux

Finite state machine for php.

375.6k1](/packages/shrink0r-workflux)[pwm/s-flow

A lightweight library for defining state machines

742.5k](/packages/pwm-s-flow)[tarfin-labs/event-machine

Event-driven state machines for Laravel with event sourcing, type-safe context, and full audit trail.

188.5k](/packages/tarfin-labs-event-machine)[ringierimu/state-workflow

Laravel State Workflow provide tools for defining and managing workflows and activities with ease.

3251.1k](/packages/ringierimu-state-workflow)[phpmentors/stagehand-fsm

A finite state machine

361.1k](/packages/phpmentors-stagehand-fsm)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
