/** * Проверка, на то нужно ли запускать workflow * * @param WorkflowDispatchEventInterface $e * * @return boolean|null * * @throws \Zend\Validator\Exception\InvalidArgumentException * @throws Exception\PrepareDataException */ public function onCheckRunWorkflowHandler(WorkflowDispatchEventInterface $e) { $metadata = $e->getMetadata(); if (!$metadata->getFlagHasConditions()) { return null; } try { $conditions = $metadata->getConditions(); $validatorManager = $this->getValidatorManager(); /** @var ValidatorChain $validatorChains */ $validatorChains = $validatorManager->get(ValidatorChain::class); } catch (\Exception $e) { throw new Exception\PrepareDataException($e->getMessage(), $e->getCode(), $e); } $mvcEvent = $e->getMvcEvent(); $controller = $mvcEvent->getTarget(); if (!$controller instanceof AbstractController) { $controller = null; } foreach ($conditions as $condition) { try { $type = $condition->getType(); $handler = $condition->getHandler(); switch ($type) { case 'method': if (null === $controller) { $errMsg = 'Controller not specified'; throw new Exception\CheckRunWorkflowEventException($errMsg); } $callback = [$controller, $handler]; /** @var ValidatorInterface $callbackValidator */ $callbackValidator = $validatorManager->get('callback', $callback); $validatorChains->attach($callbackValidator); break; case 'service': $validatorParams = $condition->getParams(); /** @var ValidatorInterface $validator */ $validator = $validatorManager->get($handler, $validatorParams); $validatorChains->attach($validator); break; default: $errMsg = sprintf('Preparing data for Workflow will fail. Unknown handler type %s.', $type); throw new Exception\PrepareDataException($errMsg); } } catch (\Exception $e) { throw new Exception\PrepareDataException($e->getMessage(), $e->getCode(), $e); } } return $validatorChains->isValid($e); }
/** * Получение метаданных для запуска workflow * * @param WorkflowDispatchEventInterface $e * * @return RunWorkflowParam|null * * @throws Exception\InvalidMetadataException * @throws Exception\ResolveEntryIdEventException * @throws Exception\InvalidWorkflowManagerAliasException * @throws Exception\RuntimeException */ public function onMetadataWorkflowToRun(WorkflowDispatchEventInterface $e) { $mvcEvent = $e->getMvcEvent(); $controller = $mvcEvent->getTarget(); if (!$controller instanceof AbstractController) { return null; } $routeMatch = $mvcEvent->getRouteMatch(); if (!$routeMatch) { return null; } $action = $routeMatch->getParam('action', 'not-found'); $actionMethod = AbstractController::getMethodFromAction($action); if (!method_exists($controller, $actionMethod)) { return null; } $controllerClassName = get_class($controller); $metadata = $this->getMetadataReader()->loadMetadataForAction($controllerClassName, $actionMethod); if (!$metadata instanceof MetadataInterface) { $errMsg = sprintf('Metadata not implement %s', MetadataInterface::class); throw new Exception\InvalidMetadataException($errMsg); } $workflowManagerNameParam = $metadata->getWorkflowManagerNameRouterParam(); $workflowManagerNameFromRoute = $routeMatch->getParam($workflowManagerNameParam, null); $workflowManagerAliasParam = $metadata->getWorkflowManagerAliasRouterParam(); $workflowManagerAlias = $routeMatch->getParam($workflowManagerAliasParam, null); $workflowManagerName = $workflowManagerNameFromRoute; if (null !== $workflowManagerAlias) { $workflowService = $this->getWorkflowService(); if (!$workflowService->hasWorkflowManagerAlias($workflowManagerAlias)) { $errMsg = sprintf('Invalid workflow manager alias: %s', $workflowManagerAlias); throw new Exception\InvalidWorkflowManagerAliasException($errMsg); } $workflowManagerNameByAlias = $workflowService->getManagerNameByAlias($workflowManagerAlias); if (null !== $workflowManagerNameFromRoute && $workflowManagerNameFromRoute !== $workflowManagerNameByAlias) { $errMsg = sprintf('Name collision workflow manager.The name of the alias: %s. The name of the router: %s', $workflowManagerNameByAlias, $workflowManagerNameFromRoute); throw new Exception\RuntimeException($errMsg); } $workflowManagerName = $workflowManagerNameByAlias; } $workflowActionNameParam = $metadata->getWorkflowActionNameRouterParam(); $workflowActionName = $routeMatch->getParam($workflowActionNameParam, null); if (null === $workflowManagerName || null === $workflowActionName) { $this->getLog()->debug('Metadata Workflow to start not found', ['workflowManagerNameFromRoute' => $workflowManagerNameFromRoute, 'workflowManagerAlias' => $workflowManagerAlias, 'workflowManagerName' => $workflowManagerName, 'workflowActionName' => $workflowActionName]); return null; } $runType = $e->getMetadata()->getWorkflowRunType(); $workflowNameParam = $metadata->getWorkflowNameRouterParam(); $workflowName = $routeMatch->getParam($workflowNameParam, null); $runWorkflowParam = new RunWorkflowParam(); $runWorkflowParam->setRunType($runType); $runWorkflowParam->setManagerName($workflowManagerName); $runWorkflowParam->setActionName($workflowActionName); if (RunWorkflowParam::WORKFLOW_RUN_INITIALIZE === $runType && null !== $workflowName) { $runWorkflowParam->setWorkflowName($workflowName); return $runWorkflowParam; } if (RunWorkflowParam::WORKFLOW_RUN_TYPE_DO_ACTION === $runType) { $event = $this->resolveEntryIdEventFactory(); $event->setWorkflowDispatchEvent($e); $event->setRunType($runType); $event->setActionName($workflowActionName); $event->setManagerName($workflowManagerName); $event->setWorkflowName($workflowName); $event->setManagerAlias($workflowManagerAlias); $resolveEntryIdResults = $this->getEventManager()->trigger(ResolveEntryIdEventInterface::RESOLVE_ENTRY_ID_EVENT, $event, function ($item) { return is_numeric($item); }); $resolveEntryIdResult = $resolveEntryIdResults->last(); if (is_numeric($resolveEntryIdResult)) { $runWorkflowParam->setEntryId($resolveEntryIdResult); return $runWorkflowParam; } } return null; }