Skip to content

Commit 2ee1307

Browse files
Nyholmlyrixx
authored andcommitted
[Workflow] Added Definition builder
1 parent f86385f commit 2ee1307

File tree

2 files changed

+22
-25
lines changed

2 files changed

+22
-25
lines changed

Command/WorkflowDumpCommand.php

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -66,23 +66,13 @@ protected function execute(InputInterface $input, OutputInterface $output)
6666
throw new \InvalidArgumentException(sprintf('No service found for "workflow.%1$s" nor "state_machine.%1$s".', $serviceId));
6767
}
6868

69-
$definition = $this->getProperty($workflow, 'definition');
70-
7169
$dumper = new GraphvizDumper();
72-
7370
$marking = new Marking();
71+
7472
foreach ($input->getArgument('marking') as $place) {
7573
$marking->mark($place);
7674
}
7775

78-
$output->writeln($dumper->dump($definition, $marking));
79-
}
80-
81-
private function getProperty($object, $property)
82-
{
83-
$reflectionProperty = new \ReflectionProperty(Workflow::class, $property);
84-
$reflectionProperty->setAccessible(true);
85-
86-
return $reflectionProperty->getValue($object);
76+
$output->writeln($dumper->dump($workflow->getDefinition(), $marking));
8777
}
8878
}

DependencyInjection/FrameworkExtension.php

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -406,20 +406,32 @@ private function registerWorkflowConfiguration(array $workflows, ContainerBuilde
406406
foreach ($workflows as $name => $workflow) {
407407
$type = $workflow['type'];
408408

409-
$definitionDefinition = new Definition(Workflow\Definition::class);
410-
$definitionDefinition->addMethodCall('addPlaces', array($workflow['places']));
409+
// Create a DefinitionBuilder
410+
$definitionBuilderDefinition = new Definition(Workflow\DefinitionBuilder::class);
411+
$definitionBuilderDefinition->addMethodCall('addPlaces', array($workflow['places']));
411412
foreach ($workflow['transitions'] as $transitionName => $transition) {
412413
if ($type === 'workflow') {
413-
$definitionDefinition->addMethodCall('addTransition', array(new Definition(Workflow\Transition::class, array($transitionName, $transition['from'], $transition['to']))));
414+
$definitionBuilderDefinition->addMethodCall('addTransition', array(new Definition(Workflow\Transition::class, array($transitionName, $transition['from'], $transition['to']))));
414415
} elseif ($type === 'state_machine') {
415416
foreach ($transition['from'] as $from) {
416417
foreach ($transition['to'] as $to) {
417-
$definitionDefinition->addMethodCall('addTransition', array(new Definition(Workflow\Transition::class, array($transitionName, $from, $to))));
418+
$definitionBuilderDefinition->addMethodCall('addTransition', array(new Definition(Workflow\Transition::class, array($transitionName, $from, $to))));
418419
}
419420
}
420421
}
421422
}
422423

424+
// Create a Definition
425+
$definitionDefinition = new Definition(Workflow\Definition::class);
426+
$definitionDefinition->setPublic(false);
427+
$definitionDefinition->setFactory(array($definitionBuilderDefinition, 'build'));
428+
$definitionDefinition->addTag('workflow.definition', array(
429+
'name' => $name,
430+
'type' => $type,
431+
'marking_store' => isset($workflow['marking_store']['type']) ? $workflow['marking_store']['type'] : null,
432+
));
433+
434+
// Create MarkingStore
423435
if (isset($workflow['marking_store']['type'])) {
424436
$markingStoreDefinition = new DefinitionDecorator('workflow.marking_store.'.$workflow['marking_store']['type']);
425437
foreach ($workflow['marking_store']['arguments'] as $argument) {
@@ -429,25 +441,20 @@ private function registerWorkflowConfiguration(array $workflows, ContainerBuilde
429441
$markingStoreDefinition = new Reference($workflow['marking_store']['service']);
430442
}
431443

432-
$definitionDefinition->addTag('workflow.definition', array(
433-
'name' => $name,
434-
'type' => $type,
435-
'marking_store' => isset($workflow['marking_store']['type']) ? $workflow['marking_store']['type'] : null,
436-
));
437-
$definitionDefinition->setPublic(false);
438-
444+
// Create Workflow
439445
$workflowDefinition = new DefinitionDecorator(sprintf('%s.abstract', $type));
440446
$workflowDefinition->replaceArgument(0, $definitionDefinition);
441447
if (isset($markingStoreDefinition)) {
442448
$workflowDefinition->replaceArgument(1, $markingStoreDefinition);
443449
}
444450
$workflowDefinition->replaceArgument(3, $name);
445451

452+
// Store to container
446453
$workflowId = sprintf('%s.%s', $type, $name);
447-
448-
$container->setDefinition(sprintf('%s.definition', $workflowId), $definitionDefinition);
449454
$container->setDefinition($workflowId, $workflowDefinition);
455+
$container->setDefinition(sprintf('%s.definition', $workflowId), $definitionDefinition);
450456

457+
// Add workflow to Registry
451458
foreach ($workflow['supports'] as $supportedClass) {
452459
$registryDefinition->addMethodCall('add', array(new Reference($workflowId), $supportedClass));
453460
}

0 commit comments

Comments
 (0)