[Workflow] Changed initial_places to initial_marking, added property instead of type

This commit is contained in:
Jules Pietri 2019-03-23 20:20:32 +01:00 committed by Grégoire Pineau
parent 5fe3701f05
commit 73708a61b6
38 changed files with 214 additions and 98 deletions

View File

@ -166,11 +166,6 @@ Workflow
initial_places: [draft]
```
Yaml
----
* Using a mapping inside a multi-line string is deprecated and will throw a `ParseException` in 5.0.
Workflow
--------
@ -202,19 +197,22 @@ Workflow
```yaml
framework:
workflows:
type: workflow
article:
marking_store:
type: multiple
arguments: states
```
After:
```yaml
framework:
workflows:
type: workflow
article:
marking_store:
type: method
property: states
```
* `SingleStateMarkingStore` is deprecated. Use `MethodMarkingStore` instead.
@ -225,16 +223,21 @@ Workflow
workflows:
article:
marking_store:
type: single
arguments: state
```
After:
```yaml
framework:
workflows:
type: state_machine
article:
marking_store:
type: method
arguments:
- true
property: state
```
Yaml
----
* Using a mapping inside a multi-line string is deprecated and will throw a `ParseException` in 5.0.

View File

@ -388,8 +388,47 @@ Workflow
* `ClassInstanceSupportStrategy` has been removed, use `InstanceOfSupportStrategy` instead.
* `MarkingStoreInterface::setMarking()` has a third argument: `array $context = []`.
* Removed support of `initial_place`. Use `initial_places` instead.
* `MultipleStateMarkingStore` has been removed.
* `SingleStateMarkingStore` has been removed.
* `MultipleStateMarkingStore` has been removed. Use `MethodMarkingStore` instead.
Before:
```yaml
framework:
workflows:
type: workflow
article:
marking_store:
type: multiple
arguments: states
```
After:
```yaml
framework:
workflows:
type: workflow
article:
marking_store:
property: states
```
* `SingleStateMarkingStore` has been removed. Use `MethodMarkingStore` instead.
Before:
```yaml
framework:
workflows:
article:
marking_store:
arguments: state
```
After:
```yaml
framework:
workflows:
article:
marking_store:
property: state
```
Yaml
----

View File

@ -233,7 +233,7 @@ class Configuration implements ConfigurationInterface
$workflows = [];
}
if (1 === \count($workflows) && isset($workflows['workflows']) && array_keys($workflows['workflows']) !== range(0, \count($workflows) - 1) && !empty(array_diff(array_keys($workflows['workflows']), ['audit_trail', 'type', 'marking_store', 'supports', 'support_strategy', 'initial_places', 'places', 'transitions']))) {
if (1 === \count($workflows) && isset($workflows['workflows']) && array_keys($workflows['workflows']) !== range(0, \count($workflows) - 1) && !empty(array_diff(array_keys($workflows['workflows']), ['audit_trail', 'type', 'marking_store', 'supports', 'support_strategy', 'initial_marking', 'places', 'transitions']))) {
$workflows = $workflows['workflows'];
}
@ -258,9 +258,17 @@ class Configuration implements ConfigurationInterface
->arrayNode('workflows')
->useAttributeAsKey('name')
->prototype('array')
->beforeNormalization()
->always(function ($v) {
if (isset($v['initial_place'])) {
$v['initial_marking'] = [$v['initial_place']];
}
return $v;
})
->end()
->fixXmlConfig('support')
->fixXmlConfig('place')
->fixXmlConfig('initial_place')
->fixXmlConfig('transition')
->children()
->arrayNode('audit_trail')
@ -274,9 +282,11 @@ class Configuration implements ConfigurationInterface
->fixXmlConfig('argument')
->children()
->enumNode('type')
->setDeprecated('The "%path%.%node%" configuration key has been deprecated in Symfony 4.3. Use "method" instead as it will be the only option in Symfony 5.0.')
->values(['multiple_state', 'single_state', 'method'])
->end()
->arrayNode('arguments')
->setDeprecated('The "%path%.%node%" configuration key has been deprecated in Symfony 4.3. Use "property" instead.')
->beforeNormalization()
->ifString()
->then(function ($v) { return [$v]; })
@ -285,6 +295,9 @@ class Configuration implements ConfigurationInterface
->prototype('scalar')
->end()
->end()
->scalarNode('property')
->defaultNull()
->end()
->scalarNode('service')
->cannotBeEmpty()
->end()
@ -297,6 +310,10 @@ class Configuration implements ConfigurationInterface
->ifTrue(function ($v) { return !empty($v['arguments']) && isset($v['service']); })
->thenInvalid('"arguments" and "service" cannot be used together.')
->end()
->validate()
->ifTrue(function ($v) { return !empty($v['property']) && isset($v['service']); })
->thenInvalid('"property" and "service" cannot be used together.')
->end()
->end()
->arrayNode('supports')
->beforeNormalization()
@ -315,10 +332,10 @@ class Configuration implements ConfigurationInterface
->cannotBeEmpty()
->end()
->scalarNode('initial_place')
->setDeprecated('The "%path%.%node%" configuration key has been deprecated in Symfony 4.3, use the "initial_places" configuration key instead.')
->setDeprecated('The "%path%.%node%" configuration key has been deprecated in Symfony 4.3, use the "initial_marking" configuration key instead.')
->defaultNull()
->end()
->arrayNode('initial_places')
->arrayNode('initial_marking')
->beforeNormalization()
->ifTrue(function ($v) { return !\is_array($v); })
->then(function ($v) { return [$v]; })

View File

@ -631,14 +631,14 @@ class FrameworkExtension extends Extension
// Create places
$places = array_column($workflow['places'], 'name');
$initialPlaces = $workflow['initial_places'] ?? $workflow['initial_place'] ?? [];
$initialMarking = $workflow['initial_marking'] ?? $workflow['initial_place'] ?? [];
// Create a Definition
$definitionDefinition = new Definition(Workflow\Definition::class);
$definitionDefinition->setPublic(false);
$definitionDefinition->addArgument($places);
$definitionDefinition->addArgument($transitions);
$definitionDefinition->addArgument($initialPlaces);
$definitionDefinition->addArgument($initialMarking);
$definitionDefinition->addArgument($metadataStoreDefinition);
// Create MarkingStore
@ -647,6 +647,12 @@ class FrameworkExtension extends Extension
foreach ($workflow['marking_store']['arguments'] as $argument) {
$markingStoreDefinition->addArgument($argument);
}
if ('method' === $workflow['marking_store']['type']) {
$markingStoreDefinition->setArguments([
'state_machine' === $type, //single state
$workflow['marking_store']['property'] ?? 'marking',
]);
}
} elseif (isset($workflow['marking_store']['service'])) {
$markingStoreDefinition = new Reference($workflow['marking_store']['service']);
}
@ -686,7 +692,7 @@ class FrameworkExtension extends Extension
->addTransitions(array_map(function (Reference $ref) use ($container): Workflow\Transition {
return $container->get((string) $ref);
}, $transitions))
->setInitialPlace($initialPlaces)
->setInitialPlace($initialMarking)
->build()
;
$validator->validate($realDefinition, $name);

View File

@ -279,7 +279,7 @@
<xsd:complexType name="workflow">
<xsd:sequence>
<xsd:element name="initial-place" type="xsd:string" minOccurs="0" maxOccurs="unbounded" />
<xsd:element name="initial-marking" type="xsd:string" minOccurs="0" maxOccurs="unbounded" />
<xsd:element name="marking-store" type="marking_store" minOccurs="0" maxOccurs="1" />
<xsd:element name="support" type="xsd:string" minOccurs="0" maxOccurs="unbounded" />
<xsd:element name="place" type="place" minOccurs="0" maxOccurs="unbounded" />
@ -289,6 +289,7 @@
<xsd:attribute name="name" type="xsd:string" />
<xsd:attribute name="type" type="workflow_type" />
<xsd:attribute name="initial-place" type="xsd:string" />
<xsd:attribute name="initial-marking" type="xsd:string" />
<xsd:attribute name="support-strategy" type="xsd:string" />
<xsd:attribute name="enabled" type="xsd:boolean" />
</xsd:complexType>
@ -304,12 +305,14 @@
</xsd:sequence>
<xsd:attribute name="type" type="marking_store_type" />
<xsd:attribute name="service" type="xsd:string" />
<xsd:attribute name="property" type="xsd:string" />
</xsd:complexType>
<xsd:simpleType name="marking_store_type">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="multiple_state" />
<xsd:enumeration value="single_state" />
<xsd:enumeration value="method" />
</xsd:restriction>
</xsd:simpleType>

View File

@ -1,7 +1,5 @@
<?php
use Symfony\Bundle\FrameworkBundle\Tests\DependencyInjection\FrameworkExtensionTest;
$container->loadFromExtension('framework', [
'workflows' => [
'legacy' => [

View File

@ -6,7 +6,7 @@ $container->loadFromExtension('framework', [
'workflows' => [
'my_workflow' => [
'marking_store' => [
'type' => 'multiple_state',
'type' => 'method',
'service' => 'workflow_service',
],
'supports' => [

View File

@ -6,13 +6,10 @@ $container->loadFromExtension('framework', [
'workflows' => [
'article' => [
'type' => 'workflow',
'marking_store' => [
'type' => 'multiple_state',
],
'supports' => [
FrameworkExtensionTest::class,
],
'initial_places' => ['draft'],
'initial_marking' => ['draft'],
'places' => [
'draft',
'wait_for_journalist',

View File

@ -6,13 +6,10 @@ $container->loadFromExtension('framework', [
'workflows' => [
'article' => [
'type' => 'workflow',
'marking_store' => [
'type' => 'multiple_state',
],
'supports' => [
FrameworkExtensionTest::class,
],
'initial_places' => ['draft'],
'initial_marking' => ['draft'],
'places' => [
'draft',
'wait_for_journalist',

View File

@ -0,0 +1,32 @@
<?php
use Symfony\Bundle\FrameworkBundle\Tests\DependencyInjection\FrameworkExtensionTest;
$container->loadFromExtension('framework', [
'workflows' => [
'my_workflow' => [
'type' => 'workflow',
'marking_store' => [
'property' => 'states',
'service' => 'workflow_service',
],
'supports' => [
FrameworkExtensionTest::class,
],
'places' => [
'first',
'last',
],
'transitions' => [
'go' => [
'from' => [
'first',
],
'to' => [
'last',
],
],
],
],
],
]);

View File

@ -5,9 +5,7 @@ use Symfony\Bundle\FrameworkBundle\Tests\DependencyInjection\FrameworkExtensionT
$container->loadFromExtension('framework', [
'workflows' => [
'my_workflow' => [
'marking_store' => [
'type' => 'multiple_state',
],
'type' => 'workflow',
'supports' => [
FrameworkExtensionTest::class,
],

View File

@ -1,13 +1,9 @@
<?php
use Symfony\Bundle\FrameworkBundle\Tests\DependencyInjection\FrameworkExtensionTest;
$container->loadFromExtension('framework', [
'workflows' => [
'my_workflow' => [
'marking_store' => [
'type' => 'multiple_state',
],
'type' => 'workflow',
'places' => [
'first',
'last',

View File

@ -6,13 +6,10 @@ $container->loadFromExtension('framework', [
'workflows' => [
'article' => [
'type' => 'workflow',
'marking_store' => [
'type' => 'multiple_state',
],
'supports' => [
FrameworkExtensionTest::class,
],
'initial_places' => ['draft'],
'initial_marking' => ['draft'],
'places' => [
'draft',
'wait_for_journalist',
@ -41,13 +38,10 @@ $container->loadFromExtension('framework', [
],
],
'pull_request' => [
'marking_store' => [
'type' => 'single_state',
],
'supports' => [
FrameworkExtensionTest::class,
],
'initial_places' => ['start'],
'initial_marking' => 'start',
'metadata' => [
'title' => 'workflow title',
],

View File

@ -6,7 +6,7 @@ $container->loadFromExtension('framework', [
'foo' => [
'type' => 'workflow',
'supports' => ['Symfony\Bundle\FrameworkBundle\Tests\DependencyInjection\FrameworkExtensionTest'],
'initial_places' => ['bar'],
'initial_marking' => ['bar'],
'places' => ['bar', 'baz'],
'transitions' => [
'bar_baz' => [

View File

@ -6,7 +6,7 @@ $container->loadFromExtension('framework', [
'workflows' => [
'type' => 'workflow',
'supports' => ['Symfony\Bundle\FrameworkBundle\Tests\DependencyInjection\FrameworkExtensionTest'],
'initial_places' => ['bar'],
'initial_marking' => ['bar'],
'places' => ['bar', 'baz'],
'transitions' => [
'bar_baz' => [

View File

@ -9,8 +9,8 @@
<framework:config>
<framework:workflow name="legacy" type="workflow" initial-place="draft">
<framework:support>stdClass</framework:support>
<framework:place name="draft"></framework:place>
<framework:place name="published"></framework:place>
<framework:place name="draft" />
<framework:place name="published" />
<framework:transition name="publish">
<framework:from>draft</framework:from>
<framework:to>published</framework:to>

View File

@ -8,7 +8,7 @@
<framework:config>
<framework:workflow name="my_workflow">
<framework:marking-store type="multiple_state" service="workflow_service" />
<framework:marking-store type="method" service="workflow_service" />
<framework:support>Symfony\Bundle\FrameworkBundle\Tests\DependencyInjection\FrameworkExtensionTest</framework:support>
<framework:place name="first" />
<framework:place name="last" />

View File

@ -8,8 +8,8 @@
<framework:config>
<framework:workflow name="article" type="workflow">
<framework:initial-place>draft</framework:initial-place>
<framework:marking-store type="multiple_state">
<framework:initial-marking>draft</framework:initial-marking>
<framework:marking-store>
<framework:argument>a</framework:argument>
<framework:argument>a</framework:argument>
</framework:marking-store>

View File

@ -8,7 +8,7 @@
<framework:config>
<framework:workflow name="article" type="workflow">
<framework:initial-place>draft</framework:initial-place>
<framework:initial-marking>draft</framework:initial-marking>
<framework:marking-store type="multiple_state">
<framework:argument>a</framework:argument>
<framework:argument>a</framework:argument>

View File

@ -0,0 +1,21 @@
<?xml version="1.0" ?>
<container xmlns="http://symfony.com/schema/dic/services"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:framework="http://symfony.com/schema/dic/symfony"
xsi:schemaLocation="http://symfony.com/schema/dic/services https://symfony.com/schema/dic/services/services-1.0.xsd
http://symfony.com/schema/dic/symfony https://symfony.com/schema/dic/symfony/symfony-1.0.xsd">
<framework:config>
<framework:workflow name="my_workflow">
<framework:marking-store property="multiple_state" service="workflow_service" />
<framework:support>Symfony\Bundle\FrameworkBundle\Tests\DependencyInjection\FrameworkExtensionTest</framework:support>
<framework:place name="first" />
<framework:place name="last" />
<framework:transition name="foobar">
<framework:from>a</framework:from>
<framework:to>a</framework:to>
</framework:transition>
</framework:workflow>
</framework:config>
</container>

View File

@ -7,8 +7,7 @@
http://symfony.com/schema/dic/symfony https://symfony.com/schema/dic/symfony/symfony-1.0.xsd">
<framework:config>
<framework:workflow name="my_workflow" support-strategy="foobar">
<framework:marking-store type="multiple_state"/>
<framework:workflow name="my_workflow" support-strategy="foobar" type="workflow">
<framework:support>Symfony\Bundle\FrameworkBundle\Tests\DependencyInjection\FrameworkExtensionTest</framework:support>
<framework:place name="first" />
<framework:place name="last" />

View File

@ -7,8 +7,7 @@
http://symfony.com/schema/dic/symfony https://symfony.com/schema/dic/symfony/symfony-1.0.xsd">
<framework:config>
<framework:workflow name="my_workflow">
<framework:marking-store type="multiple_state"/>
<framework:workflow name="my_workflow" type="workflow">
<framework:place name="first" />
<framework:place name="last" />
<framework:transition name="foobar">

View File

@ -8,18 +8,18 @@
<framework:config>
<framework:workflow name="article" type="workflow">
<framework:initial-place>draft</framework:initial-place>
<framework:initial-marking>draft</framework:initial-marking>
<framework:marking-store type="multiple_state">
<framework:argument>a</framework:argument>
<framework:argument>a</framework:argument>
</framework:marking-store>
<framework:support>Symfony\Bundle\FrameworkBundle\Tests\DependencyInjection\FrameworkExtensionTest</framework:support>
<framework:place name="draft"></framework:place>
<framework:place name="wait_for_journalist"></framework:place>
<framework:place name="approved_by_journalist"></framework:place>
<framework:place name="wait_for_spellchecker"></framework:place>
<framework:place name="approved_by_spellchecker"></framework:place>
<framework:place name="published"></framework:place>
<framework:place name="draft" />
<framework:place name="wait_for_journalist" />
<framework:place name="approved_by_journalist" />
<framework:place name="wait_for_spellchecker" />
<framework:place name="approved_by_spellchecker" />
<framework:place name="published" />
<framework:transition name="request_review">
<framework:from>draft</framework:from>
<framework:to>wait_for_journalist</framework:to>
@ -40,8 +40,8 @@
</framework:transition>
</framework:workflow>
<framework:workflow name="pull_request" initial-place="start">
<framework:marking-store type="single_state"/>
<framework:workflow name="pull_request">
<framework:initial-marking>start</framework:initial-marking>
<framework:support>Symfony\Bundle\FrameworkBundle\Tests\DependencyInjection\FrameworkExtensionTest</framework:support>
<framework:place name="start">
<framework:metadata>

View File

@ -6,8 +6,7 @@
http://symfony.com/schema/dic/symfony https://symfony.com/schema/dic/symfony/symfony-1.0.xsd">
<framework:config>
<framework:workflow enabled="true" name="foo" type="workflow">
<framework:initial-place>bar</framework:initial-place>
<framework:workflow enabled="true" name="foo" type="workflow" initial-marking="start">
<framework:support>Symfony\Bundle\FrameworkBundle\Tests\DependencyInjection\FrameworkExtensionTest</framework:support>
<framework:place>bar</framework:place>
<framework:place>baz</framework:place>

View File

@ -7,7 +7,7 @@
<framework:config>
<framework:workflow enabled="true" name="workflows" type="workflow">
<framework:initial-place>bar</framework:initial-place>
<framework:initial-marking>bar</framework:initial-marking>
<framework:support>Symfony\Bundle\FrameworkBundle\Tests\DependencyInjection\FrameworkExtensionTest</framework:support>
<framework:place>bar</framework:place>
<framework:place>baz</framework:place>

View File

@ -2,7 +2,7 @@ framework:
workflows:
my_workflow:
marking_store:
type: multiple_state
type: method
service: workflow_service
supports:
- Symfony\Bundle\FrameworkBundle\Tests\DependencyInjection\FrameworkExtensionTest

View File

@ -2,18 +2,16 @@ framework:
workflows:
article:
type: workflow
marking_store:
type: multiple_state
supports:
- Symfony\Bundle\FrameworkBundle\Tests\DependencyInjection\FrameworkExtensionTest
initial_places: [draft]
- Symfony\Bundle\FrameworkBundle\Tests\DependencyInjection\FrameworkExtensionTest
initial_marking: [draft]
places:
- draft
- wait_for_journalist
- approved_by_journalist
- wait_for_spellchecker
- approved_by_spellchecker
- published
- draft
- wait_for_journalist
- approved_by_journalist
- wait_for_spellchecker
- approved_by_spellchecker
- published
transitions:
request_review:
from: [draft]

View File

@ -2,11 +2,9 @@ framework:
workflows:
article:
type: workflow
marking_store:
type: multiple_state
supports:
- Symfony\Bundle\FrameworkBundle\Tests\DependencyInjection\FrameworkExtensionTest
initial_places: [draft]
initial_marking: [draft]
places:
- draft
- wait_for_journalist

View File

@ -0,0 +1,17 @@
framework:
workflows:
my_workflow:
marking_store:
property: state
service: workflow_service
supports:
- Symfony\Bundle\FrameworkBundle\Tests\DependencyInjection\FrameworkExtensionTest
places:
- first
- last
transitions:
go:
from:
- first
to:
- last

View File

@ -1,8 +1,7 @@
framework:
workflows:
my_workflow:
marking_store:
type: multiple_state
type: workflow
supports:
- Symfony\Bundle\FrameworkBundle\Tests\DependencyInjection\FrameworkExtensionTest
support_strategy: foobar

View File

@ -1,8 +1,7 @@
framework:
workflows:
my_workflow:
marking_store:
type: multiple_state
type: workflow
places:
- first
- last

View File

@ -2,11 +2,9 @@ framework:
workflows:
article:
type: workflow
marking_store:
type: multiple_state
supports:
- Symfony\Bundle\FrameworkBundle\Tests\DependencyInjection\FrameworkExtensionTest
initial_places: [draft]
initial_marking: [draft]
places:
# simple format
- draft
@ -29,11 +27,9 @@ framework:
from: [approved_by_journalist, approved_by_spellchecker]
to: [published]
pull_request:
marking_store:
type: single_state
supports:
- Symfony\Bundle\FrameworkBundle\Tests\DependencyInjection\FrameworkExtensionTest
initial_places: [start]
initial_marking: start
metadata:
title: workflow title
places:

View File

@ -6,7 +6,7 @@ framework:
type: workflow
supports:
- Symfony\Bundle\FrameworkBundle\Tests\DependencyInjection\FrameworkExtensionTest
initial_places: [bar]
initial_marking: [bar]
places:
- bar
- baz

View File

@ -5,7 +5,7 @@ framework:
type: workflow
supports:
- Symfony\Bundle\FrameworkBundle\Tests\DependencyInjection\FrameworkExtensionTest
initial_places: [bar]
initial_marking: [bar]
places:
- bar
- baz

View File

@ -307,12 +307,23 @@ abstract class FrameworkExtensionTest extends TestCase
}
/**
* @expectedException \Symfony\Component\Config\Definition\Exception\InvalidConfigurationException
* @expectedExceptionMessage "property" and "service" cannot be used together.
*/
public function testWorkflowCannotHaveBothPropertyAndService()
{
$this->createContainerFromFile('workflow_with_property_and_service');
}
/**
* @legacy
*
* @expectedException \Symfony\Component\Config\Definition\Exception\InvalidConfigurationException
* @expectedExceptionMessage "type" and "service" cannot be used together.
*/
public function testWorkflowCannotHaveBothTypeAndService()
{
$this->createContainerFromFile('workflow_with_type_and_service');
$this->createContainerFromFile('workflow_legacy_with_type_and_service');
}
/**
@ -339,7 +350,7 @@ abstract class FrameworkExtensionTest extends TestCase
*/
public function testWorkflowCannotHaveBothArgumentsAndService()
{
$this->createContainerFromFile('workflow_with_arguments_and_service');
$this->createContainerFromFile('workflow_legacy_with_arguments_and_service');
}
public function testWorkflowMultipleTransitionsWithSameName()