Refactor workflow classes and forms

- the workflow controller add a context to each transition;
- the state of the entity workflow is applyied using a dedicated marking store
- the method EntityWorkflow::step use the context to associate the new step with the future destination user, cc users and email. This makes the step consistent at every step.
- this allow to remove some logic which was processed in eventSubscribers,
- as counterpart, each workflow must specify a dedicated marking_store:

```yaml
framework:
    workflows:
        vendee_internal:
            # ...
            marking_store:
                service: Chill\MainBundle\Workflow\EntityWorkflowMarkingStore
```
This commit is contained in:
2024-07-01 20:47:15 +02:00
parent 3db4fff80d
commit a309cc0774
16 changed files with 362 additions and 257 deletions

View File

@@ -0,0 +1,49 @@
<?php
declare(strict_types=1);
/*
* Chill is a software for social workers
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*/
namespace Chill\MainBundle\Workflow;
use Chill\MainBundle\Entity\Workflow\EntityWorkflow;
use Symfony\Component\Workflow\Marking;
use Symfony\Component\Workflow\MarkingStore\MarkingStoreInterface;
final readonly class EntityWorkflowMarkingStore implements MarkingStoreInterface
{
public function getMarking(object $subject): Marking
{
if (!$subject instanceof EntityWorkflow) {
throw new \UnexpectedValueException('Expected instance of EntityWorkflow');
}
$step = $subject->getCurrentStep();
return new Marking([$step->getCurrentStep() => 1]);
}
public function setMarking(object $subject, Marking $marking, array $context = []): void
{
if (!$subject instanceof EntityWorkflow) {
throw new \UnexpectedValueException('Expected instance of EntityWorkflow');
}
$places = $marking->getPlaces();
if (1 < count($places)) {
throw new \LogicException('Expected maximum one place');
}
$next = array_keys($places)[0];
$transitionDTO = $context['context'] ?? null;
if (!$transitionDTO instanceof WorkflowTransitionContextDTO) {
throw new \UnexpectedValueException(sprintf('Expected instance of %s', WorkflowTransitionContextDTO::class));
}
$subject->setStep($next, $transitionDTO);
}
}