azim-ut / workflowapi
Base workflow API library
Installs: 11
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 0
Forks: 0
Open Issues: 0
pkg:composer/azim-ut/workflowapi
Requires
- php: >=7.4
README
Workflow API — это лёгкий и расширяемый инструмент для описания и исполнения бизнес-логики на основе JSON-конфигов.
Плагин позволяет вынести алгоритмы в декларативные схемы (например, workflow.json), а исполнение делегировать PHP-коду, сохраняя чистоту архитектуры.
Возможности
- Декларативное описание логики в JSON:
payload— входные данные, неизменные. Содержимое payload доступно только для чтения, payload можно передовать в качестве параметров в commands;state— внутренние параметры, в state можно сохранять результаты исполнения commands или передавать в commands в качестве параметров на чтение/запись;commands— зарегистрированные команды (методы, функции);route— последовательность блоков (ACTION, IF_ELSE, SWITCH, LOG и др.);
- Поддержка переменных
${payload.*},${state.*}; - Выполнение кастомных команд, зарегистрированных через
setCommand(); - Лёгкая интеграция с сервисами и библиотеками;
- Логирование шагов исполнения.
Установка
composer require azim-ut/workflow-api
Пример использования
$textService = new TextService(); $config = WorkflowService::builder() ->fromJsonFile(__DIR__ . '/conf/workflow.json') ->setCommand("getTextLength", [$textService, "getTextLength"]) ->setCommand("matchPattern", [$textService, "matchAny"]) ->setCommand("setStatus", [$textService, "setStatus"]) ->build(); $payload = new stdClass(); $payload->text = "Hello world!"; $payload->patterns = ["ello", "earth"]; $result = WorkflowService::executor()->run($config, $payload);
Пример workflow.json
{
"state": {"size": 0, "match": false, "status": "OPEN"},
"commands": [
"getTextLength",
"matchPattern",
"setStatus"
],
"route": [
{
"id": 1,
"type": "COMMAND",
"command": "getTextLength ${payload.text} welcomeBtn closeBtn",
"state": "size",
"next": 2
},
{
"id": 2,
"type": "IF_ELSE",
"condition": "${state.size} < 10",
"yes": 6,
"no": 3
},
{
"id": 3,
"type": "COMMAND",
"command": "matchPattern ${payload.text} ${payload.patterns}",
"state": "match",
"next": 4
},
{
"id": 4,
"type": "IF_ELSE",
"condition": "${state.match}",
"yes": 6,
"no": 7
},
{
"id": 6,
"type": "STATE",
"target": "status",
"val": "CLOSED",
"next": 7
},
{
"id": 7,
"type": "COMMAND",
"command": "setStatus ${payload.text} ${payload.status}",
"next": 0
}
],
"log": []
}