Skip to content

[Workflow] fixed $context not available on GuardEvent #43996

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions UPGRADE-5.3.md
Original file line number Diff line number Diff line change
Expand Up @@ -245,3 +245,4 @@ Workflow
--------

* Deprecate `InvalidTokenConfigurationException`
* Deprecate `WorkflowInterface::getMarking()`, use `WorkflowInterface::getWorkflowMarking()` instead
1 change: 1 addition & 0 deletions UPGRADE-6.0.md
Original file line number Diff line number Diff line change
Expand Up @@ -400,6 +400,7 @@ Workflow
--------

* Remove `InvalidTokenConfigurationException`
* Remove `WorkflowInterface::getMarking()` in favor of `WorkflowInterface::getWorkflowMarking()`

Yaml
----
Expand Down
24 changes: 12 additions & 12 deletions src/Symfony/Bridge/Twig/Extension/WorkflowExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -51,42 +51,42 @@ public function getFunctions(): array
/**
* Returns true if the transition is enabled.
*/
public function canTransition(object $subject, string $transitionName, string $name = null): bool
public function canTransition(object $subject, string $transitionName, string $name = null, array $context = []): bool
{
return $this->workflowRegistry->get($subject, $name)->can($subject, $transitionName);
return $this->workflowRegistry->get($subject, $name)->can($subject, $transitionName, $context);
}

/**
* Returns all enabled transitions.
*
* @return Transition[] All enabled transitions
*/
public function getEnabledTransitions(object $subject, string $name = null): array
public function getEnabledTransitions(object $subject, string $name = null, array $context = []): array
{
return $this->workflowRegistry->get($subject, $name)->getEnabledTransitions($subject);
return $this->workflowRegistry->get($subject, $name)->getEnabledTransitions($subject, $context);
}

public function getEnabledTransition(object $subject, string $transition, string $name = null): ?Transition
public function getEnabledTransition(object $subject, string $transition, string $name = null, array $context = []): ?Transition
{
return $this->workflowRegistry->get($subject, $name)->getEnabledTransition($subject, $transition);
return $this->workflowRegistry->get($subject, $name)->getEnabledTransition($subject, $transition, $context);
}

/**
* Returns true if the place is marked.
*/
public function hasMarkedPlace(object $subject, string $placeName, string $name = null): bool
public function hasMarkedPlace(object $subject, string $placeName, string $name = null, array $context = []): bool
{
return $this->workflowRegistry->get($subject, $name)->getMarking($subject)->has($placeName);
return $this->workflowRegistry->get($subject, $name)->getWorkflowMarking($subject, $context)->has($placeName);
}

/**
* Returns marked places.
*
* @return string[]|int[]
*/
public function getMarkedPlaces(object $subject, bool $placesNameOnly = true, string $name = null): array
public function getMarkedPlaces(object $subject, bool $placesNameOnly = true, string $name = null, array $context = []): array
{
$places = $this->workflowRegistry->get($subject, $name)->getMarking($subject)->getPlaces();
$places = $this->workflowRegistry->get($subject, $name)->getWorkflowMarking($subject, $context)->getPlaces();

if ($placesNameOnly) {
return array_keys($places);
Expand All @@ -112,10 +112,10 @@ public function getMetadata(object $subject, string $key, $metadataSubject = nul
;
}

public function buildTransitionBlockerList(object $subject, string $transitionName, string $name = null): TransitionBlockerList
public function buildTransitionBlockerList(object $subject, string $transitionName, string $name = null, array $context = []): TransitionBlockerList
{
$workflow = $this->workflowRegistry->get($subject, $name);

return $workflow->buildTransitionBlockerList($subject, $transitionName);
return $workflow->buildTransitionBlockerList($subject, $transitionName, $context);
}
}
3 changes: 2 additions & 1 deletion src/Symfony/Component/Workflow/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,10 @@ CHANGELOG

5.3
---

* Deprecate `WorkflowInterface::getMarking()` method use `WorkflowInterface::getWorkflowMarking()` instead
* Deprecate `InvalidTokenConfigurationException`
* Added `MermaidDumper` to dump Workflow graphs in the Mermaid.js flowchart format
* Added `$context` to GuardEvent constructor

5.2.0
-----
Expand Down
4 changes: 2 additions & 2 deletions src/Symfony/Component/Workflow/Event/GuardEvent.php
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,9 @@ final class GuardEvent extends Event
/**
* {@inheritdoc}
*/
public function __construct(object $subject, Marking $marking, Transition $transition, WorkflowInterface $workflow = null)
public function __construct(object $subject, Marking $marking, Transition $transition, WorkflowInterface $workflow = null, array $context = [])
{
parent::__construct($subject, $marking, $transition, $workflow);
parent::__construct($subject, $marking, $transition, $workflow, $context);

$this->transitionBlockerList = new TransitionBlockerList();
}
Expand Down
10 changes: 5 additions & 5 deletions src/Symfony/Component/Workflow/Tests/WorkflowTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ public function testGetMarkingWithInvalidStoreReturn()
$subject = new Subject();
$workflow = new Workflow(new Definition([], []), $this->createMock(MarkingStoreInterface::class));

$workflow->getMarking($subject);
$workflow->getWorkflowMarking($subject);
}

public function testGetMarkingWithEmptyDefinition()
Expand All @@ -40,7 +40,7 @@ public function testGetMarkingWithEmptyDefinition()
$subject = new Subject();
$workflow = new Workflow(new Definition([], []), new MethodMarkingStore());

$workflow->getMarking($subject);
$workflow->getWorkflowMarking($subject);
}

public function testGetMarkingWithImpossiblePlace()
Expand All @@ -51,7 +51,7 @@ public function testGetMarkingWithImpossiblePlace()
$subject->setMarking(['nope' => 1]);
$workflow = new Workflow(new Definition([], []), new MethodMarkingStore());

$workflow->getMarking($subject);
$workflow->getWorkflowMarking($subject);
}

public function testGetMarkingWithEmptyInitialMarking()
Expand All @@ -60,7 +60,7 @@ public function testGetMarkingWithEmptyInitialMarking()
$subject = new Subject();
$workflow = new Workflow($definition, new MethodMarkingStore());

$marking = $workflow->getMarking($subject);
$marking = $workflow->getWorkflowMarking($subject);

$this->assertInstanceOf(Marking::class, $marking);
$this->assertTrue($marking->has('a'));
Expand All @@ -74,7 +74,7 @@ public function testGetMarkingWithExistingMarking()
$subject->setMarking(['b' => 1, 'c' => 1]);
$workflow = new Workflow($definition, new MethodMarkingStore());

$marking = $workflow->getMarking($subject);
$marking = $workflow->getWorkflowMarking($subject);

$this->assertInstanceOf(Marking::class, $marking);
$this->assertTrue($marking->has('b'));
Expand Down
53 changes: 32 additions & 21 deletions src/Symfony/Component/Workflow/Workflow.php
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
* @author Grégoire Pineau <lyrixx@lyrixx.info>
* @author Tobias Nyholm <tobias.nyholm@gmail.com>
* @author Carlos Pereira De Amorim <carlos@shauri.fr>
* @author Maikel Ortega Hernandez <maikeloh@gmail.com>
*/
class Workflow implements WorkflowInterface
{
Expand Down Expand Up @@ -79,7 +80,17 @@ public function __construct(Definition $definition, MarkingStoreInterface $marki
/**
* {@inheritdoc}
*/
public function getMarking(object $subject, array $context = [])
public function getMarking(object $subject)
{
trigger_deprecation('symfony/workflow', '5.3', 'The method "%s" is deprecated.You should stop using it, as it will be removed in the future. Use "%s::getWorkflowMarking" instead.', __METHOD__, WorkflowInterface::class);
return $this->getWorkflowMarking($subject);
}


/**
* {@inheritdoc}
*/
public function getWorkflowMarking(object $subject, array $context = [])
{
$marking = $this->markingStore->getMarking($subject);

Expand All @@ -99,7 +110,7 @@ public function getMarking(object $subject, array $context = [])
// update the subject with the new marking
$this->markingStore->setMarking($subject, $marking);

if (!$context) {
if (empty($context)) {
$context = self::DEFAULT_INITIAL_CONTEXT;
}

Expand All @@ -125,17 +136,17 @@ public function getMarking(object $subject, array $context = [])
/**
* {@inheritdoc}
*/
public function can(object $subject, string $transitionName)
public function can(object $subject, string $transitionName, array $context = [])
{
$transitions = $this->definition->getTransitions();
$marking = $this->getMarking($subject);
$marking = $this->getWorkflowMarking($subject, $context);

foreach ($transitions as $transition) {
if ($transition->getName() !== $transitionName) {
continue;
}

$transitionBlockerList = $this->buildTransitionBlockerListForTransition($subject, $marking, $transition);
$transitionBlockerList = $this->buildTransitionBlockerListForTransition($subject, $marking, $transition, $context);

if ($transitionBlockerList->isEmpty()) {
return true;
Expand All @@ -148,18 +159,18 @@ public function can(object $subject, string $transitionName)
/**
* {@inheritdoc}
*/
public function buildTransitionBlockerList(object $subject, string $transitionName): TransitionBlockerList
public function buildTransitionBlockerList(object $subject, string $transitionName, array $context = []): TransitionBlockerList
{
$transitions = $this->definition->getTransitions();
$marking = $this->getMarking($subject);
$marking = $this->getWorkflowMarking($subject, $context);
$transitionBlockerList = null;

foreach ($transitions as $transition) {
if ($transition->getName() !== $transitionName) {
continue;
}

$transitionBlockerList = $this->buildTransitionBlockerListForTransition($subject, $marking, $transition);
$transitionBlockerList = $this->buildTransitionBlockerListForTransition($subject, $marking, $transition, $context);

if ($transitionBlockerList->isEmpty()) {
return $transitionBlockerList;
Expand All @@ -186,7 +197,7 @@ public function buildTransitionBlockerList(object $subject, string $transitionNa
*/
public function apply(object $subject, string $transitionName, array $context = [])
{
$marking = $this->getMarking($subject, $context);
$marking = $this->getWorkflowMarking($subject, $context);

$transitionExist = false;
$approvedTransitions = [];
Expand All @@ -199,7 +210,7 @@ public function apply(object $subject, string $transitionName, array $context =

$transitionExist = true;

$tmpTransitionBlockerList = $this->buildTransitionBlockerListForTransition($subject, $marking, $transition);
$tmpTransitionBlockerList = $this->buildTransitionBlockerListForTransition($subject, $marking, $transition, $context);

if ($tmpTransitionBlockerList->isEmpty()) {
$approvedTransitions[] = $transition;
Expand Down Expand Up @@ -250,13 +261,13 @@ public function apply(object $subject, string $transitionName, array $context =
/**
* {@inheritdoc}
*/
public function getEnabledTransitions(object $subject)
public function getEnabledTransitions(object $subject, array $context = [])
{
$enabledTransitions = [];
$marking = $this->getMarking($subject);
$marking = $this->getWorkflowMarking($subject, $context);

foreach ($this->definition->getTransitions() as $transition) {
$transitionBlockerList = $this->buildTransitionBlockerListForTransition($subject, $marking, $transition);
$transitionBlockerList = $this->buildTransitionBlockerListForTransition($subject, $marking, $transition, $context);
if ($transitionBlockerList->isEmpty()) {
$enabledTransitions[] = $transition;
}
Expand All @@ -265,15 +276,15 @@ public function getEnabledTransitions(object $subject)
return $enabledTransitions;
}

public function getEnabledTransition(object $subject, string $name): ?Transition
public function getEnabledTransition(object $subject, string $name, array $context = []): ?Transition
{
$marking = $this->getMarking($subject);
$marking = $this->getWorkflowMarking($subject, $context);

foreach ($this->definition->getTransitions() as $transition) {
if ($transition->getName() !== $name) {
continue;
}
$transitionBlockerList = $this->buildTransitionBlockerListForTransition($subject, $marking, $transition);
$transitionBlockerList = $this->buildTransitionBlockerListForTransition($subject, $marking, $transition, $context);
if (!$transitionBlockerList->isEmpty()) {
continue;
}
Expand Down Expand Up @@ -316,7 +327,7 @@ public function getMetadataStore(): MetadataStoreInterface
return $this->definition->getMetadataStore();
}

private function buildTransitionBlockerListForTransition(object $subject, Marking $marking, Transition $transition): TransitionBlockerList
private function buildTransitionBlockerListForTransition(object $subject, Marking $marking, Transition $transition, array $context = []): TransitionBlockerList
{
foreach ($transition->getFroms() as $place) {
if (!$marking->has($place)) {
Expand All @@ -330,7 +341,7 @@ private function buildTransitionBlockerListForTransition(object $subject, Markin
return new TransitionBlockerList();
}

$event = $this->guardTransition($subject, $marking, $transition);
$event = $this->guardTransition($subject, $marking, $transition, $context);

if ($event->isBlocked()) {
return $event->getTransitionBlockerList();
Expand All @@ -339,13 +350,13 @@ private function buildTransitionBlockerListForTransition(object $subject, Markin
return new TransitionBlockerList();
}

private function guardTransition(object $subject, Marking $marking, Transition $transition): ?GuardEvent
private function guardTransition(object $subject, Marking $marking, Transition $transition, array $context = []): ?GuardEvent
{
if (null === $this->dispatcher) {
return null;
}

$event = new GuardEvent($subject, $marking, $transition, $this);
$event = new GuardEvent($subject, $marking, $transition, $this, $context);

$this->dispatcher->dispatch($event, WorkflowEvents::GUARD);
$this->dispatcher->dispatch($event, sprintf('workflow.%s.guard', $this->name));
Expand Down Expand Up @@ -449,7 +460,7 @@ private function announce(object $subject, Transition $initialTransition, Markin
$this->dispatcher->dispatch($event, WorkflowEvents::ANNOUNCE);
$this->dispatcher->dispatch($event, sprintf('workflow.%s.announce', $this->name));

foreach ($this->getEnabledTransitions($subject) as $transition) {
foreach ($this->getEnabledTransitions($subject, $context) as $transition) {
$this->dispatcher->dispatch($event, sprintf('workflow.%s.announce.%s', $this->name, $transition->getName()));
}
}
Expand Down
17 changes: 14 additions & 3 deletions src/Symfony/Component/Workflow/WorkflowInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -26,20 +26,31 @@ interface WorkflowInterface
* @return Marking The Marking
*
* @throws LogicException
*
* @deprecated since Symfony 5.3 use getWorkflowMarking instead.
*/
public function getMarking(object $subject);

/**
* Returns the object's Marking.
*
* @return Marking The Marking
*
* @throws LogicException
*/
public function getWorkflowMarking(object $subject, array $context = []);

/**
* Returns true if the transition is enabled.
*
* @return bool true if the transition is enabled
*/
public function can(object $subject, string $transitionName);
public function can(object $subject, string $transitionName, array $context = []);

/**
* Builds a TransitionBlockerList to know why a transition is blocked.
*/
public function buildTransitionBlockerList(object $subject, string $transitionName): TransitionBlockerList;
public function buildTransitionBlockerList(object $subject, string $transitionName, array $context = []): TransitionBlockerList;

/**
* Fire a transition.
Expand All @@ -55,7 +66,7 @@ public function apply(object $subject, string $transitionName, array $context =
*
* @return Transition[] All enabled transitions
*/
public function getEnabledTransitions(object $subject);
public function getEnabledTransitions(object $subject, array $context = []);

/**
* @return string
Expand Down