/
WorkflowValidator.php
58 lines (49 loc) · 2.22 KB
/
WorkflowValidator.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Component\Workflow\Validator;
use Symfony\Component\Workflow\Definition;
use Symfony\Component\Workflow\Exception\InvalidDefinitionException;
/**
* @author Tobias Nyholm <tobias.nyholm@gmail.com>
* @author Grégoire Pineau <lyrixx@lyrixx.info>
*/
class WorkflowValidator implements DefinitionValidatorInterface
{
private bool $singlePlace;
public function __construct(bool $singlePlace = false)
{
$this->singlePlace = $singlePlace;
}
public function validate(Definition $definition, string $name): void
{
// Make sure all transitions for one place has unique name.
$places = array_fill_keys($definition->getPlaces(), []);
foreach ($definition->getTransitions() as $transition) {
foreach ($transition->getFroms() as $from) {
if (\in_array($transition->getName(), $places[$from])) {
throw new InvalidDefinitionException(sprintf('All transitions for a place must have an unique name. Multiple transitions named "%s" where found for place "%s" in workflow "%s".', $transition->getName(), $from, $name));
}
$places[$from][] = $transition->getName();
}
}
if (!$this->singlePlace) {
return;
}
foreach ($definition->getTransitions() as $transition) {
if (1 < \count($transition->getTos())) {
throw new InvalidDefinitionException(sprintf('The marking store of workflow "%s" cannot store many places. But the transition "%s" has too many output (%d). Only one is accepted.', $name, $transition->getName(), \count($transition->getTos())));
}
}
$initialPlaces = $definition->getInitialPlaces();
if (2 <= \count($initialPlaces)) {
throw new InvalidDefinitionException(sprintf('The marking store of workflow "%s" cannot store many places. But the definition has %d initial places. Only one is supported.', $name, \count($initialPlaces)));
}
}
}