/** * Обработччик отвечающий за иньъекцию в менеджер workflow, поддержки запуска сервисов * * @param WorkflowManagerEvent $event */ public function createWorkflowManager(WorkflowManagerEvent $event) { $workflowManager = $event->getWorkflowManager(); $originalTypeResolver = $workflowManager->getResolver(); $chainTypeResolver = $this->getChainTypeResolver(); $resolver = $chainTypeResolver->add($originalTypeResolver, 0); $workflowTypeResolverEvent = new WorkflowTypeResolverEvent(); $workflowTypeResolverEvent->setName(WorkflowTypeResolverEvent::INJECT_WORKFLOW_TYPE_RESOLVER); $workflowTypeResolverEvent->setWorkflowManager($workflowManager); $workflowTypeResolverEvent->setChainTypeResolver($chainTypeResolver); $workflowTypeResolverEvent->setTarget($this); $this->getEventManager()->trigger($workflowTypeResolverEvent); $workflowManager->setTypeResolver($resolver); }
/** * @param ServiceLocatorInterface $serviceLocator * @param $name * @param $requestedName * * @return WorkflowInterface * @throws \Zend\ServiceManager\Exception\ServiceNotFoundException * * @throws \OldTown\Workflow\ZF2\Factory\Exception\FactoryException */ public function createServiceWithName(ServiceLocatorInterface $serviceLocator, $name, $requestedName) { if (null === $this->workflowServiceNamePrefix) { $this->workflowServiceNamePrefix = $this->buildWorkflowServiceNamePrefix($serviceLocator); } $managerName = substr($requestedName, strlen($this->workflowServiceNamePrefix)); try { $creationOptions = $this->getCreationOptions(); if (array_key_exists(static::WORKFLOW_CONFIGURATION_NAME, $creationOptions)) { $this->setWorkflowConfigurationName($creationOptions[static::WORKFLOW_CONFIGURATION_NAME]); } /** @var ModuleOptions $moduleOptions */ $moduleOptions = $serviceLocator->get(ModuleOptions::class); $managerOptions = $moduleOptions->getManagerOptions($managerName); $configName = $managerOptions->getConfiguration(); $workflowManagerName = $managerOptions->getName(); $workflowManager = null; if ($serviceLocator->has($workflowManagerName)) { $workflowManager = $serviceLocator->get($workflowManagerName); } elseif (class_exists($workflowManagerName)) { $r = new \ReflectionClass($workflowManagerName); $workflowManager = $r->newInstance($r); } if (!$workflowManager instanceof WorkflowInterface) { $errMsg = sprintf('Workflow not implements %s', WorkflowInterface::class); throw new Exception\InvalidWorkflowException($errMsg); } $configurationOptions = $moduleOptions->getConfigurationOptions($configName); $workflowConfig = $this->buildWorkflowManagerConfig($configurationOptions, $serviceLocator); $workflowManager->setConfiguration($workflowConfig); /** @var Workflow $workflowService */ $workflowService = $serviceLocator->get(Workflow::class); $event = new WorkflowManagerEvent(); $event->setWorkflowManager($workflowManager)->setName(WorkflowManagerEvent::EVENT_CREATE)->setTarget($workflowManager); $workflowService->getEventManager()->trigger($event); } catch (\Exception $e) { throw new Exception\FactoryException($e->getMessage(), $e->getCode(), $e); } return $workflowManager; }