|
31 | 31 | use Symfony\Component\Serializer\Normalizer\DateTimeNormalizer;
|
32 | 32 | use Symfony\Component\Serializer\Normalizer\JsonSerializableNormalizer;
|
33 | 33 | use Symfony\Component\Validator\Validation;
|
| 34 | +use Symfony\Component\Workflow; |
34 | 35 |
|
35 | 36 | /**
|
36 | 37 | * FrameworkExtension.
|
37 | 38 | *
|
38 | 39 | * @author Fabien Potencier <fabien@symfony.com>
|
39 | 40 | * @author Jeremy Mikola <jmikola@gmail.com>
|
40 | 41 | * @author Kévin Dunglas <dunglas@gmail.com>
|
| 42 | + * @author Grégoire Pineau <lyrixx@lyrixx.info> |
41 | 43 | */
|
42 | 44 | class FrameworkExtension extends Extension
|
43 | 45 | {
|
@@ -129,6 +131,7 @@ public function load(array $configs, ContainerBuilder $container)
|
129 | 131 | $this->registerTranslatorConfiguration($config['translator'], $container);
|
130 | 132 | $this->registerProfilerConfiguration($config['profiler'], $container, $loader);
|
131 | 133 | $this->registerCacheConfiguration($config['cache'], $container);
|
| 134 | + $this->registerWorkflowConfiguration($config['workflows'], $container, $loader); |
132 | 135 |
|
133 | 136 | if ($this->isConfigEnabled($container, $config['router'])) {
|
134 | 137 | $this->registerRouterConfiguration($config['router'], $container, $loader);
|
@@ -346,6 +349,54 @@ private function registerProfilerConfiguration(array $config, ContainerBuilder $
|
346 | 349 | }
|
347 | 350 | }
|
348 | 351 |
|
| 352 | + /** |
| 353 | + * Loads the workflow configuration. |
| 354 | + * |
| 355 | + * @param array $workflows A workflow configuration array |
| 356 | + * @param ContainerBuilder $container A ContainerBuilder instance |
| 357 | + * @param XmlFileLoader $loader An XmlFileLoader instance |
| 358 | + */ |
| 359 | + private function registerWorkflowConfiguration(array $workflows, ContainerBuilder $container, XmlFileLoader $loader) |
| 360 | + { |
| 361 | + if (!$workflows) { |
| 362 | + return; |
| 363 | + } |
| 364 | + |
| 365 | + $loader->load('workflow.xml'); |
| 366 | + |
| 367 | + $registryDefinition = $container->getDefinition('workflow.registry'); |
| 368 | + |
| 369 | + foreach ($workflows as $name => $workflow) { |
| 370 | + $definitionDefinition = new Definition(Workflow\Definition::class); |
| 371 | + $definitionDefinition->addMethodCall('addPlaces', array($workflow['places'])); |
| 372 | + foreach ($workflow['transitions'] as $transitionName => $transition) { |
| 373 | + $definitionDefinition->addMethodCall('addTransition', array(new Definition(Workflow\Transition::class, array($transitionName, $transition['from'], $transition['to'])))); |
| 374 | + } |
| 375 | + |
| 376 | + if (isset($workflow['marking_store']['type'])) { |
| 377 | + $markingStoreDefinition = new DefinitionDecorator('workflow.marking_store.'.$workflow['marking_store']['type']); |
| 378 | + foreach ($workflow['marking_store']['arguments'] as $argument) { |
| 379 | + $markingStoreDefinition->addArgument($argument); |
| 380 | + } |
| 381 | + } else { |
| 382 | + $markingStoreDefinition = new Reference($workflow['marking_store']['service']); |
| 383 | + } |
| 384 | + |
| 385 | + $workflowDefinition = new DefinitionDecorator('workflow.abstract'); |
| 386 | + $workflowDefinition->replaceArgument(0, $definitionDefinition); |
| 387 | + $workflowDefinition->replaceArgument(1, $markingStoreDefinition); |
| 388 | + $workflowDefinition->replaceArgument(3, $name); |
| 389 | + |
| 390 | + $workflowId = 'workflow.'.$name; |
| 391 | + |
| 392 | + $container->setDefinition($workflowId, $workflowDefinition); |
| 393 | + |
| 394 | + foreach ($workflow['supports'] as $supportedClass) { |
| 395 | + $registryDefinition->addMethodCall('add', array(new Reference($workflowId), $supportedClass)); |
| 396 | + } |
| 397 | + } |
| 398 | + } |
| 399 | + |
349 | 400 | /**
|
350 | 401 | * Loads the router configuration.
|
351 | 402 | *
|
|
0 commit comments