8000 [Workflow] Event parameters · symfony/symfony@52eccf9 · GitHub
[go: up one dir, main page]

Skip to content

Commit 52eccf9

Browse files
committed
[Workflow] Event parameters
1 parent 16cea37 commit 52eccf9

File tree

3 files changed

+55
-33
lines changed

3 files changed

+55
-33
lines changed

src/Symfony/Component/Workflow/Event/Event.php

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,17 +24,20 @@ class Event extends BaseEvent
2424
private $subject;
2525
private $marking;
2626
private $transition;
27+
private $parameters;
2728

2829
/**
2930
* @param object $subject
3031
* @param Marking $marking
3132
* @param Transition $transition
33+
* @param array $parameters
3234
*/
33-
public function __construct($subject, Marking $marking, Transition $transition)
35+
public function __construct($subject, Marking $marking, Transition $transition, array $parameters = array())
3436
{
3537
$this->subject = $subject;
3638
$this->marking = $marking;
3739
$this->transition = $transition;
40+
$this->parameters = $parameters;
3841
}
3942

4043
public function getMarking()
@@ -51,4 +54,9 @@ public function getTransition()
5154
{
5255
return $this->transition;
5356
}
57+
58+
public function getParameters()
59+
{
60+
return $this->parameters;
61+
}
5462
}

src/Symfony/Component/Workflow/Tests/WorkflowTest.php

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,21 @@ public function testApplyWithEventDispatcher()
182182

183183
$marking = $workflow->apply($subject, 't1');
184184

185-
$this->assertSame($eventNameExpected, $eventDispatcher->dispatchedEvents);
185+
$this->assertSame($eventNameExpected, $eventDispatcher->dispatchedEventNames);
186+
}
187+
188+
public function testApplyWithEventDispatcherAndParameters()
189+
{
190+
$definition = $this->createComplexWorkflowDefinition();
191+
$subject = new \stdClass();
192+
$subject->marking = null;
193+
$eventDispatcher = new EventDispatcherMock();
194+
$workflow = new Workflow($definition, new MultipleStateMarkingStore(), $eventDispatcher, 'workflow_name');
195+
196+
$parameters = array('code' => '123');
197+
$marking = $workflow->apply($subject, 't1', $parameters);
198+
199+
$this->assertSame($parameters, $eventDispatcher->dispatchedEvents[0]->getParameters());
186200
}
187201

188202
public function testGetEnabledTransitions()
@@ -214,10 +228,12 @@ public function testGetEnabledTransitions()
214228
class EventDispatcherMock implements \Symfony\Component\EventDispatcher\EventDispatcherInterface
215229
{
216230
public $dispatchedEvents = array();
231+
public $dispatchedEventNames = array();
217232

218233
public function dispatch($eventName, \Symfony\Component\EventDispatcher\Event $event = null)
219234
{
220-
$this->dispatchedEvents[] = $eventName;
235+
$this->dispatchedEvents[] = $event;
236+
$this->dispatchedEventNames[] = $eventName;
221237
}
222238

223239
public function addListener($eventName, $listener, $priority = 0)

src/Symfony/Component/Workflow/Workflow.php

Lines changed: 28 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -85,50 +85,47 @@ public function getMarking($subject)
8585
/**
8686
* Returns true if the transition is enabled.
8787
*
88-
* @param object $subject A subject
89-
* @param string $transitionName A transition
88+
* @param object $subject A subject
89+
* @param string $transitionName A transition
90+
* @param array $eventParameters
9091
*
9192
* @return bool true if the transition is enabled
92-
*
93-
* @throws LogicException If the transition does not exist
9493
*/
95-
public function can($subject, $transitionName)
94+
public function can($subject, $transitionName, array $eventParameters = array())
9695
{
9796
$transitions = $this->getTransitions($transitionName);
9897
$marking = $this->getMarking($subject);
9998

100-
return null !== $this->getTransitionForSubject($subject, $marking, $transitions);
99+
return null !== $this->getTransitionForSubject($subject, $marking, $transitions, $eventParameters);
101100
}
102101

103102
/**
104103
* Fire a transition.
105104
*
106-
* @param object $subject A subject
107-
* @param string $transitionName A transition
105+
* @param object $subject A subject
106+
* @param string $transitionName A transition
107+
* @param array $eventParameters
108108
*
109109
* @return Marking The new Marking
110-
*
111-
* @throws LogicException If the transition is not applicable
112-
* @throws LogicException If the transition does not exist
113110
*/
114-
public function apply($subject, $transitionName)
111+
public function apply($subject, $transitionName, array $eventParameters = array())
115112
{
116113
$transitions = $this->getTransitions($transitionName);
117114
$marking = $this->getMarking($subject);
118115

119-
if (null === $transition = $this->getTransitionForSubject($subject, $marking, $transitions)) {
116+
if (null === $transition = $this->getTransitionForSubject($subject, $marking, $transitions, $eventParameters)) {
120117
throw new LogicException(sprintf('Unable to apply transition "%s" for workflow "%s".', $transitionName, $this->name));
121118
}
122119

123-
$this->leave($subject, $transition, $marking);
120+
$this->leave($subject, $transition, $marking, $eventParameters);
124121

125-
$this->transition($subject, $transition, $marking);
122+
$this->transition($subject, $transition, $marking, $eventParameters);
126123

127-
$this->enter($subject, $transition, $marking);
124+
$this->enter($subject, $transition, $marking, $eventParameters);
128125

129126
$this->markingStore->setMarking($subject, $marking);
130127

131-
$this->announce($subject, $transition, $marking);
128+
$this->announce($subject, $transition, $marking, $eventParameters);
132129

133130
return $marking;
134131
}
@@ -174,13 +171,13 @@ public function getDefinition()
174171
*
175172
* @return bool|void boolean true if this transition is guarded, ie you cannot use it
176173
*/
177-
private function guardTransition($subject, Marking $marking, Transition $transition)
174+
private function guardTransition($subject, Marking $marking, Transition $transition, array $eventParameters = array())
178175
{
179176
if (null === $this->dispatcher) {
180177
return;
181178
}
182179

183-
$event = new GuardEvent($subject, $marking, $transition);
180+
$event = new GuardEvent($subject, $marking, $transition, $eventParameters);
184181

185182
$this->dispatcher->dispatch('workflow.guard', $event);
186183
$this->dispatcher->dispatch(sprintf('workflow.%s.guard', $this->name), $event);
@@ -189,10 +186,10 @@ private function guardTransition($subject, Marking $marking, Transition $transit
189186
return $event->isBlocked();
190187
}
191188

192-
private function leave($subject, Transition $transition, Marking $marking)
189+
private function leave($subject, Transition $transition, Marking $marking, array $eventParameters = array())
193190
{
194191
if (null !== $this->dispatcher) {
195-
$event = new Event($subject, $marking, $transition);
192+
$event = new Event($subject, $marking, $transition, $eventParameters);
196193

197194
$this->dispatcher->dispatch('workflow.leave', $event);
198195
$this->dispatcher->dispatch(sprintf('workflow.%s.leave', $this->name), $event);
@@ -207,23 +204,23 @@ private function leave($subject, Transition $transition, Marking $marking)
207204
}
208205
}
209206

210-
private function transition($subject, Transition $transition, Marking $marking)
207+
private function transition($subject, Transition $transition, Marking $marking, array $eventParameters = array())
211208
{
212209
if (null === $this->dispatcher) {
213210
return;
214211
}
215212

216-
$event = new Event($subject, $marking, $transition);
213+
$event = new Event($subject, $marking, $transition, $eventParameters);
217214

218215
$this->dispatcher->dispatch('workflow.transition', $event);
219216
$this->dispatcher->dispatch(sprintf('workflow.%s.transition', $this->name), $event);
220217
$this->dispatcher->dispatch(sprintf('workflow.%s.transition.%s', $this->name, $transition->getName()), $event);
221218
}
222219

223-
private function enter($subject, Transition $transition, Marking $marking)
220+
private function enter($subject, Transition $transition, Marking $marking, array $eventParameters = array())
224221
{
225222
if (null !== $this->dispatcher) {
226-
$event = new Event($subject, $marking, $transition);
223+
$event = new Event($subject, $marking, $transition, $eventParameters);
227224

228225
$this->dispatcher->dispatch('workflow.enter', $event);
229226
$this->dispatcher->dispatch(sprintf('workflow.%s.enter', $this->name), $event);
@@ -238,13 +235,13 @@ private function enter($subject, Transition $transition, Marking $marking)
238235
}
239236
}
240237

241-
private function announce($subject, Transition $initialTransition, Marking $marking)
238+
private function announce($subject, Transition $initialTransition, Marking $marking, array $eventParameters = array())
242239
{
243240
if (null === $this->dispatcher) {
244241
return;
245242
}
246243

247-
$event = new Event($subject, $marking, $initialTransition);
244+
$event = new Event($subject, $marking, $initialTransition, $eventParameters);
248245

249246
foreach ($this->definition->getTransitions() as $transition) {
250247
if (null !== $this->getTransitionForSubject($subject, $marking, array($transition))) {
@@ -281,10 +278,11 @@ private function getTransitions($transitionName)
281278
* @param object $subject
282279
* @param Marking $marking
283280
* @param Transition[] $transitions
281+
* @param array $eventParameters
284282
*
285-
* @return Transition|null
283+
* @return null|Transition
286284
*/
287-
private function getTransitionForSubject($subject, Marking $marking, array $transitions)
285+
private function getTransitionForSubject($subject, Marking $marking, array $transitions, array $eventParameters = array())
288286
{
289287
foreach ($transitions as $transition) {
290288
foreach ($transition->getFroms() as $place) {
@@ -293,7 +291,7 @@ private function getTransitionForSubject($subject, Marking $marking, array $tran
293291
}
294292
}
295293

296-
if (true !== $this->guardTransition($subject, $marking, $transition)) {
294+
if (true !== $this->guardTransition($subject, $marking, $transition, $eventParameters)) {
297295
return $transition;
298296
}
299297
}

0 commit comments

Comments
 (0)
0