Skip to content

Commit 8375f23

Browse files
committed
[Workflow] Choose which Workflow events should be dispatched (fix previous commit)
1 parent 5b5a3e7 commit 8375f23

22 files changed

+191
-287
lines changed

src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php

Lines changed: 37 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
use Symfony\Component\Translation\Translator;
3535
use Symfony\Component\Validator\Validation;
3636
use Symfony\Component\WebLink\HttpHeaderSerializer;
37+
use Symfony\Component\Workflow\WorkflowEvents;
3738

3839
/**
3940
* FrameworkExtension configuration structure.
@@ -339,7 +340,7 @@ private function addWorkflowSection(ArrayNodeDefinition $rootNode)
339340
->fixXmlConfig('support')
340341
->fixXmlConfig('place')
341342
->fixXmlConfig('transition')
342-
->fixXmlConfig('dispatched_event')
343+
->fixXmlConfig('event_to_dispatch', 'events_to_dispatch')
343344
->children()
344345
->arrayNode('audit_trail')
345346
->canBeEnabled()
@@ -382,21 +383,32 @@ private function addWorkflowSection(ArrayNodeDefinition $rootNode)
382383
->defaultValue([])
383384
->prototype('scalar')->end()
384385
->end()
385-
->arrayNode('dispatched_events')
386-
->beforeNormalization()
387-
->ifString()
388-
->then(function ($v) {
389-
return [$v];
386+
->variableNode('events_to_dispatch')
387+
->defaultValue(null)
388+
->validate()
389+
->ifTrue(function ($v) {
390+
if (null === $v) {
391+
return false;
392+
}
393+
if (!\is_array($v)) {
394+
return true;
395+
}
396+
397+
foreach ($v as $value) {
398+
if (!\is_string($value)) {
399+
return true;
400+
}
401+
if (class_exists(WorkflowEvents::class) && !\in_array($value, WorkflowEvents::ALIASES)) {
402+
return true;
403+
}
404+
}
405+
406+
return false;
390407
})
408+
->thenInvalid('The value must be "null" or an array of workflow events (like ["workflow.enter"]).')
391409
->end()
392-
// We have to specify a default here as when this config option
393-
// isn't set the default behaviour of `arrayNode()` is to return an empty
394-
// array which conflicts with our Definition, and we cannot set a default
395-
// of `null` for arrayNode()'s
396-
->defaultValue(['all'])
397-
->prototype('scalar')->end()
398410
->info('Select which Transition events should be dispatched for this Workflow')
399-
->example(['leave', 'completed'])
411+
->example(['workflow.enter', 'workflow.transition'])
400412
->end()
401413
->arrayNode('places')
402414
->beforeNormalization()
@@ -526,6 +538,18 @@ private function addWorkflowSection(ArrayNodeDefinition $rootNode)
526538
})
527539
->thenInvalid('"supports" or "support_strategy" should be configured.')
528540
->end()
541+
->beforeNormalization()
542+
->always()
543+
->then(function ($values) {
544+
// Special case to deal with XML when the user wants an empty array
545+
if (\array_key_exists('event_to_dispatch', $values) && null === $values['event_to_dispatch']) {
546+
$values['events_to_dispatch'] = [];
547+
unset($values['event_to_dispatch']);
548+
}
549+
550+
return $values;
551+
})
552+
->end()
529553
->end()
530554
->end()
531555
->end()

src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -741,25 +741,13 @@ private function registerWorkflowConfiguration(array $config, ContainerBuilder $
741741
$places = array_column($workflow['places'], 'name');
742742
$initialMarking = $workflow['initial_marking'] ?? [];
743743

744-
// Record which events should be dispatched
745-
if ($workflow['dispatched_events'] === ['all']) {
746-
$dispatchedEvents = null;
747-
} elseif ($workflow['dispatched_events'] === ['none']) {
748-
$dispatchedEvents = [];
749-
} else {
750-
$dispatchedEvents = array_map(function (string $event) {
751-
return 'workflow.'.$event;
752-
}, $workflow['dispatched_events']);
753-
}
754-
755744
// Create a Definition
756745
$definitionDefinition = new Definition(Workflow\Definition::class);
757746
$definitionDefinition->setPublic(false);
758747
$definitionDefinition->addArgument($places);
759748
$definitionDefinition->addArgument($transitions);
760749
$definitionDefinition->addArgument($initialMarking);
761750
$definitionDefinition->addArgument($metadataStoreDefinition);
762-
$definitionDefinition->addArgument($dispatchedEvents);
763751
$definitionDefinition->addTag('workflow.definition', [
764752
'name' => $name,
765753
'type' => $type,
@@ -783,6 +771,7 @@ private function registerWorkflowConfiguration(array $config, ContainerBuilder $
783771
$workflowDefinition->replaceArgument(1, $markingStoreDefinition);
784772
}
785773
$workflowDefinition->replaceArgument(3, $name);
774+
$workflowDefinition->replaceArgument(4, $workflow['events_to_dispatch']);
786775

787776
// Store to container
788777
$container->setDefinition($workflowId, $workflowDefinition);

src/Symfony/Bundle/FrameworkBundle/Resources/config/schema/symfony-1.0.xsd

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -288,7 +288,7 @@
288288
<xsd:element name="initial-marking" type="xsd:string" minOccurs="0" maxOccurs="unbounded" />
289289
<xsd:element name="marking-store" type="marking_store" minOccurs="0" maxOccurs="1" />
290290
<xsd:element name="support" type="xsd:string" minOccurs="0" maxOccurs="unbounded" />
291-
<xsd:element name="dispatched-event" type="dispatched_event" minOccurs="0" maxOccurs="unbounded" />
291+
<xsd:element name="event-to-dispatch" type="event_to_dispatch" minOccurs="0" maxOccurs="unbounded" />
292292
<xsd:element name="place" type="place" minOccurs="0" maxOccurs="unbounded" />
293293
<xsd:element name="transition" type="transition" minOccurs="0" maxOccurs="unbounded" />
294294
<xsd:element name="metadata" type="metadata" minOccurs="0" maxOccurs="unbounded" />
@@ -346,16 +346,16 @@
346346
</xsd:sequence>
347347
</xsd:complexType>
348348

349-
<xsd:simpleType name="dispatched_event">
349+
<xsd:simpleType name="event_to_dispatch">
350350
<xsd:restriction base="xsd:string">
351-
<xsd:enumeration value="all" />
352-
<xsd:enumeration value="none" />
353-
<xsd:enumeration value="leave" />
354-
<xsd:enumeration value="transition" />
355-
<xsd:enumeration value="enter" />
356-
<xsd:enumeration value="entered" />
357-
<xsd:enumeration value="completed" />
358-
<xsd:enumeration value="announce" />
351+
<xsd:enumeration value="" />
352+
<xsd:enumeration value="workflow.leave" />
353+
<xsd:enumeration value="workflow.leave" />
354+
<xsd:enumeration value="workflow.transition" />
355+
<xsd:enumeration value="workflow.enter" />
356+
<xsd:enumeration value="workflow.entered" />
357+
<xsd:enumeration value="workflow.completed" />
358+
<xsd:enumeration value="workflow.announce" />
359359
</xsd:restriction>
360360
</xsd:simpleType>
361361

src/Symfony/Bundle/FrameworkBundle/Resources/config/workflow.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
abstract_arg('marking store'),
2626
service('event_dispatcher')->ignoreOnInvalid(),
2727
abstract_arg('workflow name'),
28+
abstract_arg('dispatched events'),
2829
])
2930
->abstract()
3031
->public()
@@ -34,6 +35,7 @@
3435
abstract_arg('marking store'),
3536
service('event_dispatcher')->ignoreOnInvalid(),
3637
abstract_arg('workflow name'),
38+
abstract_arg('dispatched events'),
3739
])
3840
->abstract()
3941
->public()

src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/workflow_with_no_dispatched_events.php

Lines changed: 0 additions & 42 deletions
This file was deleted.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
'supports' => [
1414
FrameworkExtensionTest::class,
1515
],
16+
'events_to_dispatch' => [],
1617
'places' => [
1718
'one',
1819
'two',
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@
1313
'supports' => [
1414
FrameworkExtensionTest::class,
1515
],
16-
'dispatched_events' => [
17-
'leave',
18-
'completed'
16+
'events_to_dispatch' => [
17+
'workflow.leave',
18+
'workflow.completed',
1919
],
2020
'places' => [
2121
'one',
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
<framework:initial-marking>one</framework:initial-marking>
1212
<framework:marking-store type="method" property="state" />
1313
<framework:support>Symfony\Bundle\FrameworkBundle\Tests\DependencyInjection\FrameworkExtensionTest</framework:support>
14+
<framework:event-to-dispatch></framework:event-to-dispatch>
1415
<framework:place name="one" />
1516
<framework:place name="two" />
1617
<framework:place name="three" />

src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/workflow_with_specified_dispatched_events.xml

Lines changed: 0 additions & 29 deletions
This file was deleted.
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@
1111
<framework:initial-marking>one</framework:initial-marking>
1212
<framework:marking-store type="method" property="state" />
1313
<framework:support>Symfony\Bundle\FrameworkBundle\Tests\DependencyInjection\FrameworkExtensionTest</framework:support>
14-
<framework:dispatched-event>none</framework:dispatched-event>
14+
<framework:event-to-dispatch>workflow.leave</framework:event-to-dispatch>
15+
<framework:event-to-dispatch>workflow.completed</framework:event-to-dispatch>
1516
<framework:place name="one" />
1617
<framework:place name="two" />
1718
<framework:place name="three" />

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy