Функционал модуля
Модуль добавляет возможность использовать сервисы ZF2 в workflow.
Библиотека old-town-workflow является портом проекта OSWorkflow. Библиотека является самодостаточной, и не нуждается в сторонних framework. При этом работа workflow построенна таким образом, что функции(Function), условия(Condition), валидаторы(Validator), регистры(Register) - находятся вне библиотеки.
Для взаимодействия workflow с приложением, предусмотренны TypeResolver. По своей сути TypeResolver это фабрика, которая на основе типа и аргументов может создавать функции(Function), условия(Condition), валидаторы(Validator), регистры(Register).
В данном модуле реализованы дополнительные TypeResolver:
- \OldTown\Workflow\ZF2\Service\TypeResolver\ChainTypeResolver - резолвер позволяет построить цепочку из множества вложенных резолверов
- \OldTown\Workflow\ZF2\Service\TypeResolver\ServiceTypeResolver - резолвер добавляет поддержку новго типа "service"(сервисы ZF2)
При создание нового объекта менеджера workflow, модулем old-town/workflow-zf2 бросается событие workflow.manager.create. Обработка этого события осуществляется \OldTown\Workflow\ZF2\Service\Listener\InjectTypeResolver. Обработчик:
- Создает \OldTown\Workflow\ZF2\Service\TypeResolver\ChainTypeResolver
- Добавляет в него TypeResolver установленный в менеджер workflow.
- \OldTown\Workflow\ZF2\Service\Listener\InjectTypeResolver с помощью своего EventManager'а бросает собыите inject.workflow.type.resolver, обработчики данного события должны вернуть объект TypeResolver, который в последствие будет добавлен в ChainTypeResolver
- Обработчки сам подписан на событие inject.workflow.type.resolver, в обработчике возвращается \OldTown\Workflow\ZF2\Service\TypeResolver\ServiceTypeResolver
- Устанавливает в workflow в качестве резолвера \OldTown\Workflow\ZF2\Service\TypeResolver\ChainTypeResolver
Таким образом, при попытки выполнить функцию(Function), валидатор(Validator), условие(Condition) или воспользоваться регистром(Register), будет произведен обход ChainTypeResolver, где сначала будет отработает резовлер с наивысшим приоритетом(в данном случае ServiceTypeResolver), и в самую поселеднию очередь резовлер по умолчанию.
Сервисы
Для работы с сервисам использвется \OldTown\Workflow\ZF2\Service\Service\Manager. Это стандартный PluginManager ZF2. Все сервисы зарегестрированные в данном менеджере можно использовать в workflow
Сервис не должен знать ничего о workflow. Сам по себе сервис это метод определенного класса. Если у класса есть зависимости от другх компонентов системы, то эти зависимости должны быть явно описаны в констукторе класса.
Установка звисимостей осуществляется через фабрику. Таким образом, если сервис требует передачи в констуктор зависимых объектов, то сначала регистрируем сервис в \OldTown\Workflow\ZF2\Service\Service\Manager , прописывая ему нужную фабрику.
Фабрика имеет доступ к ServiceLocator приложения. Из ServiceLocator извлекаются необходимые данные, и передаются в констуктор.
Такой подходи дает возможность писать код максимально пригодный к тестированию.