sbooker/workflow
Composer 安装命令:
composer require sbooker/workflow
包简介
Simple workflow for FSM implementation
关键字:
README 文档
README
Workflow (sbooker/workflow)
Простая, но строгая реализация паттерна "Конечный автомат" (State Machine) для доменных объектов и не только.
Назначение библиотеки
Во многих приложениях состояние объекта (статус заказа, заявки, документа) — это просто поле в базе данных. Логика, разрешающая или запрещающая смену статуса, часто разбросана по разным частям кода, что приводит к ошибкам и усложняет поддержку.
Эта библиотека решает проблему, формализуя управление жизненным циклом объекта. Она заставляет вас явно определить:
- Все возможные состояния (статусы), в которых может находиться объект.
- Все разрешенные переходы между этими состояниями.
Логика переходов инкапсулируется внутри самого объекта, что делает его поведение предсказуемым и надежным.
Ключевые особенности
- Явное определение переходов: Карта переходов (
TransitionMap) — единственный источник правды о жизненном цикле объекта. - Инкапсуляция логики: Объект сам отвечает за смену своих состояний.
- Надежные статусы-объекты: Построена на litgroup/enumerable, что позволяет создавать типобезопасные и легко сохраняемые в БД статусы.
- Эффективные структуры данных: Использует
Ds\MapиDs\Setдля удобного и типобезопасного определения карты переходов (объект статуса -> набор объектов статусов). Работает 'из коробки' с 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: Определите Статусы
Создайте класс статуса, унаследовав его от 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
Унаследуйте свой класс от 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 в ваш Агрегат
Ваш доменный объект просто создает экземпляр 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: Используйте в прикладном коде
// 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
See LICENSE file.
sbooker/workflow 适用场景与选型建议
sbooker/workflow 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 6.15k 次下载、GitHub Stars 达 0, 最近一次更新时间为 2020 年 06 月 03 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「workflow」 「state machine」 「fsm」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 sbooker/workflow 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 sbooker/workflow 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 sbooker/workflow 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
Workflow for NetCommons Plugin
Doctrine implementation of the MetaborStd (Statemachine) for PHP 8.2+
A simple state dropdown field for SilverStripe forms
Workflow logger
A state Machine library for business processes
Metamel Addresses is a polymorphic Laravel package, for address book management. You can add addresses to any eloquent model with ease.
统计信息
- 总下载量: 6.15k
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 0
- 点击次数: 19
- 依赖项目数: 1
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2020-06-03