An open API service indexing awesome lists of open source software.

https://github.com/jeyroik/extas-workflow-example

Example of usage workflow package for Extas
https://github.com/jeyroik/extas-workflow-example

example extas php workflow

Last synced: about 1 month ago
JSON representation

Example of usage workflow package for Extas

Awesome Lists containing this project

README

          

# extas-workflow-example

Пример использования пакета jeyroik/extas-workflow

# установка workflow

`# vednor/bin/extas i`

# запуск

`extas-workflow-example# php -S localhost:8080 -t src/public`

После этого на страничке `http://localhost:8080` вы должны увидеть следующее:

```text
Current state = todo
Available actions (transitions):
get_in_work (change status to "in_work")
not_actual__from_todo (change status to "not_actual")

Run transition to "in_work":
Transition runtime data:
=====================
Привет мир
Entity new state is "in_work"

=====================
Transition result: success
Сбросить
```

# Объяснение

- В рамках примера устанавливается 4 состояния: `todo`, `in_work`, `done`, `not_actual`.
- Для этих состояний устанавливаются следующие переходы: `get_in_work`, `done`, `not_actual`.
- Также устаналивается несколько шаблонов для обработки переходов.
- `trigger__hello_world` - после перехода выводит сообщение "Hello world" на языке, установленным в контексте.
- `trigger__transition_finished` - вывод сообщение, что сущность переведена в состояние с указанием названия нового состояния.
- `validator__hello_jeyroik` - проверяет наличие в контексте параметра `name` и его равенство строке `jeyroik`.
- `validator__context_params` - проверяет наличие в контексте параметров, указанных в обработчике.
- `validator__entity_params` - проверяет наличие в сущности, меняющей состояние, параметров, указанных в обработчике.
- Кроме этого устанавливается схема, содержащая все указанные ранее состояния и переходы.
- Для установленной схемы workflow сразу устанавливаются и конкретные триггеры и валидаторы.

## Описание задачи, которую решает пример

- Имеется сущность `DemoEntity` в состоянии `todo`.
- Необходимо прогнать данную сущность по всем переходам схемы.
- Требуется вывести на русском языке фразу "Привет мир".
- Требуется после каждой смены состояния вывести соответствующее сообщение.
- Требуется гаранитровать, что в переходы осуществляются с именем 'jeyroik'.
- Требуется гарантировать, что в контексте после перевода сущности в состояние done будет параметр `success`, равный `true`.
- Требуется гарантировать, что в сущности после перевода сущности в состояние done будет параметр `operated`, равный `true`.

## Решение задачи

- Для того, чтобы решить поставленную задачу, в контекст помещаем следующие данные:
```php
$context = new WorkflowEntityContext([
'name' => 'jeyroik',
'lang' => 'ru'
]);
```

- Далее, для всех переходов устанавливаем триггер по шаблону `trigger__transition_finished`.
- Кроме этого, на переход в статус `done` вешаем валидаторы по параметрам контекста и сущности по шаблонам `validator__context_params` и `validator__entity_params` соответственно.
- Для удовлетворения требования по поводу `success` и `operated` создадим плагин, который будет реагировать на перевод в состояние `done`.
- Для этого плагин должен реагировать на стадию `workflow.to.done`.

Всё вместе решает поставленную задачу, удовлетворяя всем требованиям.