Сущности и процессы wf

Как правило состояния процесса wf коррелируют с состояниями одной или нескольких сущностей. На практике часто будут возникать следующие задачи:

  • Связать процесс wf с одной или несколькими сущностями доктрины
  • Получить сущности привязанные к конкретному процессу wf
  • Зная информацию о сущностях (класс и значение первичного ключа) получить id процесса workflow

Для решения этих задач реализовано хранилище состояния wf поддерживающий данный функционал (\OldTown\Workflow\ZF2\Toolkit\DoctrineWorkflowStory\DoctrineWorkflowStory).

Использование хранилища wf поддерживающего привязку информации о объекта к процессу

Конфигурирование

  • Убедится что к драйверам метаданных доктрины добавлены соответствующие строки:
'doctrine' => [
    'driver' => [
        'orm_default' => [
            'drivers' => [
                'OldTown\\Workflow\\Spi\\Doctrine\\Entity' => 'WorkflowDoctrineEntity',
                'OldTown\\Workflow\\ZF2\\Toolkit\\Entity' => 'entityToolkit'
            ],
        ],
    ],
]
  • При описание конфигурации менеджера wf корректно указано хранилище(\OldTown\Workflow\ZF2\Toolkit\DoctrineWorkflowStory\DoctrineWorkflowStory):

use \OldTown\Workflow\ZF2\Toolkit\DoctrineWorkflowStory\DoctrineWorkflowStory

'workflow_zf2'    => [
    'configurations' => [
        'default' => [
            'persistence' => [
                'name' => DoctrineWorkflowStory::class,
                'options' => [
                    DoctrineWorkflowStory::ENTITY_MANAGER_FACTORY => [
                        DoctrineWorkflowStory::ENTITY_MANAGER_FACTORY_NAME => EntityManagerFactory::class,
                        DoctrineWorkflowStory::ENTITY_MANAGER_FACTORY_OPTIONS => [
                            EntityManagerFactory::ENTITY_MANAGER_NAME => 'doctrine.entitymanager.test'
                        ]
                    ]
                ]
            ],
            'factory' => [
                'name' => ArrayWorkflowFactory::class,
                'options' => [
                    'reload' => true,
                    'workflows' => [
                        'test' => [
                            'location' => __DIR__ . '/test_workflow.xml'
                        ]
                    ]
                ]
            ],
            'resolver' => DefaultVariableResolver::class,
        ]
    ],

    'managers' => [
        'testWorkflowManager' => [
            'configuration' => 'default',
            'name' => BasicWorkflow::class
        ]
    ]
],

Сервис для работы с процессом wf и сущностями \OldTown\Workflow\ZF2\Toolkit\EntryToObjects\EntryToObjectsService

Сервис содержит в себе базовый функционал для привязки объектов к процессу, востановлению объектов на основе данных о процессе, получение процесса по данным о привязанном объекте. Сервис предназначен для использования в wf.

Метод Описание
bindObjectToWorkflowEntry Привязать объект к процессу
restoreObjectBindingToEntry Востоновить объект привязанный к процессу
getEntryByObjectsInfo Получить информацию о процессе на основе данных о объектах

Для удобной работы с данным сервисом в контроллерах, добавлен плагин для контроллера \OldTown\Workflow\ZF2\Toolkit\EntryToObjects\EntryToObjectsControllerPlugin, доступный по псевдониму workflowEntryToObjects. Этот плагин является оберткой для сервиса.

Автоматическое получение id процесса на основе данных о привязанных объектах.

В модуле реализован обработчик \OldTown\Workflow\ZF2\Toolkit\WorkflowRunParams\EntryIdResolver события workflow.dispatch.resolveEntryId сервиса \OldTown\Workflow\ZF2\Dispatch\RunParamsHandler\RouteHandler\ResolveEntryIdEvent.

Данный обработчик позволяет на основе конфигов получить значение id процесса wf, на основе значения id сущности.

Для осуществления процесса получения id необходимо в конфигах описать метаданные для маппинга:

'workflow_zf2_toolkit' => [
    'workflow_entry_to_object_metadata' => [
        'key' => [
            'workflowManagerName'  => $workflowManagerName,
            'workflowManagerAlias' => $workflowManagerAlias,
            'workflowName'         => $workflowName,
            'routeName'            => $routeName,
            'map'                  => [
                'key1' => [
                    'entityClassName' => $entityClassName,
                    'identifiersMap'  => [
                        'key2' => [
                            'propertyName' => $propertyName,
                            'mode'         => 'param|query',
                            'paramName'    => $paramName
                        ]
                    ]
                ]
            ]
        ]
    ]
]

Где:

Параметр |Описание

$workflowManagerName |имя менеджера workflow $workflowManagerAlias|псевдоним менеджера workflow $workflowName |имя используемого workflow $entityClassName |имя класса сущности которая привязывается к процессу wf $routeName |имя роутера $propertyName |имя свойства сущности(должен быть геттер и зеттер) являющиеся первичным ключем(или частью первичного ключа) $paramName |имя параметра, по которому можно получить значение для $propertyName

Необходимо помнить, что можно указать либо workflowManagerName, либо workflowManagerAlias. В случае если укзать оба этих параметра, либо не указать ни один из них, будет брошено исключение.

key, key1, key2 - любые уникальные значения. Используются что бы была возможность перегрузить конфиг на уровне приложения