registry = new Registry(); $this->config = $config; $this->dispatcher = new EventDispatcher(); foreach ($this->config as $name => $workflowData) { $this->addFromArray($name, $workflowData); } } /** * Notes : 添加一个工作流 * @Date : 2021/5/8 3:48 下午 * @Author : < Jason.C > * @param Workflow $workflow * @param string $supportStrategy */ public function add(Workflow $workflow, string $supportStrategy) { $this->registry->addWorkflow($workflow, new InstanceOfSupportStrategy($supportStrategy)); } /** * Notes : 获取工作流 * @Date : 2021/5/8 3:49 下午 * @Author : < Jason.C > * @param object $subject * @param string|null $workflowName * @return Workflow */ public function get(object $subject, string $workflowName = null): Workflow { return $this->registry->get($subject, $workflowName); } /** * 批量添加工作流到对象 * @param string $name * @param array $workflowData */ public function addFromArray(string $name, array $workflowData) { $builder = new DefinitionBuilder($workflowData['places']); foreach ($workflowData['transitions'] as $transitionName => $transition) { foreach ((array) $transition['from'] as $form) { $builder->addTransition(new Transition($transitionName, $form, $transition['to'])); } } $definition = $builder->build(); $markingStore = $this->getMarkingStoreInstance($workflowData); $workflow = $this->getWorkflowInstance($name, $workflowData, $definition, $markingStore); foreach ($workflowData['supports'] as $supportedClass) { $this->add($workflow, $supportedClass); } } /** * Notes : 根据配置获取工作流或状态机 * @Date : 2021/5/8 3:50 下午 * @Author : < Jason.C > * @param string $name * @param array $workflowData * @param Definition $definition * @param MethodMarkingStore $markingStore * @return Workflow */ protected function getWorkflowInstance( string $name, array $workflowData, Definition $definition, MethodMarkingStore $markingStore ): Workflow { if (isset($workflowData['type']) && $workflowData['type'] === 'state_machine') { $className = StateMachine::class; } else { $className = Workflow::class; } return new $className($definition, $markingStore, $this->dispatcher, $name); } /** * Notes : 获取对象存储的实例 * @Date : 2021/5/8 3:49 下午 * @Author : < Jason.C > * @param array $workflowData * @return MethodMarkingStore */ protected function getMarkingStoreInstance(array $workflowData): MethodMarkingStore { $markingStoreData = $workflowData['marking_store'] ?? []; $property = $markingStoreData['property'] ?? ''; $singleState = $markingStoreData['type'] === 'single_state'; return new MethodMarkingStore($singleState, $property); } }