Files
water-back/modules/Mall/Providers/WorkflowRegistry.php
2023-01-12 14:47:38 +08:00

135 lines
4.0 KiB
PHP

<?php
namespace Modules\Mall\Providers;
use Symfony\Component\EventDispatcher\EventDispatcher;
use Symfony\Component\Workflow\Definition;
use Symfony\Component\Workflow\DefinitionBuilder;
use Symfony\Component\Workflow\MarkingStore\MethodMarkingStore;
use Symfony\Component\Workflow\Registry;
use Symfony\Component\Workflow\StateMachine;
use Symfony\Component\Workflow\SupportStrategy\InstanceOfSupportStrategy;
use Symfony\Component\Workflow\Transition;
use Symfony\Component\Workflow\Workflow;
class WorkflowRegistry
{
/**
* @var Registry
*/
protected Registry $registry;
/**
* @var array
*/
protected array $config;
/**
* @var EventDispatcher
*/
protected EventDispatcher $dispatcher;
public function __construct(array $config)
{
$this->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);
}
}