/** * @param WorkflowDispatchEventInterface $value * * @return bool * @throws \OldTown\Workflow\ZF2\Toolkit\Validator\Exception\InvalidConvertTypeException */ public function isValid($value) { if (!$value instanceof WorkflowDispatchEventInterface) { $this->error(self::VALIDATE_VALUE_INVALID); return false; } $name = array_key_exists('paramNameInPrepareData', $this->options) ? $this->options['paramNameInPrepareData'] : null; if (!is_string($name)) { $this->error(self::PARAM_NAME_IN_PREPARE_DATA_INVALID); return false; } $prepareData = $value->getPrepareData(); if (!array_key_exists($name, $prepareData)) { $this->error(self::PARAM_NOT_FOUND_IN_PREPARE_DATA); return false; } $actualValue = $prepareData[$name]; $typeExpectedValue = array_key_exists('typeExpectedValue', $this->options) ? $this->options['typeExpectedValue'] : 'string'; $rawExpectedValue = array_key_exists('expectedValue', $this->options) ? $this->options['expectedValue'] : null; try { $expectedValue = $this->getExpectedValue($rawExpectedValue, $typeExpectedValue); } catch (Exception\InvalidConvertTypeException $e) { $this->error(self::ERROR_CONVERT_EXPECTED_VALUE); return false; } return $expectedValue === $actualValue; }
/** * @param WorkflowDispatchEventInterface $value * * @return bool */ public function isValid($value) { if (!$value instanceof WorkflowDispatchEventInterface) { $this->error(self::VALIDATE_VALUE_INVALID); return false; } if (null === $this->getAllowedHttpMethods()) { return true; } $request = $value->getMvcEvent()->getRequest(); if (!$request instanceof Request) { $this->error(self::REQUEST_INVALID); return false; } /** @var Request $request*/ $method = $request->getMethod(); $method = strtolower($method); $allowedHttpMethods = $this->getAllowedHttpMethods(); if (!array_key_exists($method, $allowedHttpMethods)) { $this->error(self::HTTP_METHOD_INVALID); return false; } return true; }
/** * Запуск workflow * * @param WorkflowDispatchEventInterface $e * * @return TransitionResultInterface * * * @throws Exception\InvalidArgumentException * @throws Exception\WorkflowDispatchEventException * @throws \OldTown\Workflow\ZF2\ServiceEngine\Exception\InvalidInitializeWorkflowEntryException * @throws \OldTown\Workflow\ZF2\ServiceEngine\Exception\DoActionException */ public function onRunWorkflowHandler(WorkflowDispatchEventInterface $e) { $runWorkflowParam = $e->getRunWorkflowParam(); $runWorkflowParam->valid(); $transientVars = $this->factoryTransientVars(); $prepareData = $e->getPrepareData(); foreach ($prepareData as $key => $value) { $transientVars[$key] = $value; } $runWorkflowParam = $e->getRunWorkflowParam(); $runWorkflowParam->valid(); $workflowManagerName = $runWorkflowParam->getManagerName(); $workflowActionName = $runWorkflowParam->getActionName(); $workflowActivity = $runWorkflowParam->getRunType(); $result = null; switch ($runWorkflowParam->getRunType()) { case RunWorkflowParamInterface::WORKFLOW_RUN_INITIALIZE: $workflowName = $runWorkflowParam->getWorkflowName(); $result = $this->getWorkflowService()->initialize($workflowManagerName, $workflowName, $workflowActionName, $transientVars); break; case RunWorkflowParamInterface::WORKFLOW_RUN_TYPE_DO_ACTION: $entryId = $runWorkflowParam->getEntryId(); $result = $this->getWorkflowService()->doAction($workflowManagerName, $entryId, $workflowActionName, $transientVars); break; default: $errMsg = sprintf('Invalid activity %s', $workflowActivity); throw new Exception\InvalidArgumentException($errMsg); } return $result; }
/** * Получение метаданных для запуска 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; }