10000 [Workflow] Event parameters · symfony/symfony@f44fc7c · GitHub
[go: up one dir, main page]

Skip to content

Commit f44fc7c

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

File tree

3 files changed

+52
-42
lines changed

3 files changed

+52
-42
lines changed

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

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,28 +11,29 @@
1111

1212
namespace Symfony\Component\Workflow\Event;
1313

14-
use Symfony\Component\EventDispatcher\Event as BaseEvent;
14+
use Symfony\Component\EventDispatcher\GenericEvent;
1515
use Symfony\Component\Workflow\Marking;
1616
use Symfony\Component\Workflow\Transition;
1717

1818
/**
1919
* @author Fabien Potencier <fabien@symfony.com>
2020
* @author Grégoire Pineau <lyrixx@lyrixx.info>
2121
*/
22-
class Event extends BaseEvent
22+
class Event extends GenericEvent
2323
{
24-
private $subject;
2524
private $marking;
2625
private $transition;
2726

2827
/**
2928
* @param object $subject
3029
* @param Marking $marking
3130
* @param Transition $transition
31+
* @param array $arguments
3232
*/
33-
public function __construct($subject, Marking $marking, Transition $transition)
33+
public function __construct($subject, Marking $marking, Transition $transition, array $arguments = array())
3434
{
35-
$this->subject = $subject;
35+
parent::__construct($subject, $arguments);
36+
3637
$this->marking = $marking;
3738
$this->transition = $transition;
3839
}
@@ -42,11 +43,6 @@ public function getMarking()
4243
return $this->marking;
4344
}
4445

45-
public function getSubject()
46-
{
47-
return $this->subject;
48-
}
49-
5046
public function getTransition()
5147
{
5248
return $this->transition;

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 testApplyWithEventDispatcherAndEventArguments()
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+
$arguments = array('code' => '123');
197+
$marking = $workflow->apply($subject, 't1', $arguments);
198+
199+
$this->assertSame($arguments, $eventDispatcher->dispatchedEvents[0]->getArguments());
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 $eventArguments
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 $eventArguments = 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, $eventArguments);
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 $eventArguments
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 $eventArguments = 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, $eventArguments)) {
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, $eventArguments);
124121

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

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

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

131-
$this->announce($subject, $transition, $marking);
128+
$this->announce($subject, $transition, $marking, $eventArguments);
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 $eventArguments = 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, $eventArguments);
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 $eventArguments = array())
193190
{
194191
if (null !== $this->dispatcher) {
195-
$event = new Event($subject, $marking, $transition);
192+
$event = new Event($subject, $marking, $transition, $eventArguments);
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 $eventArguments = 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, $eventArguments);
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 $eventArguments = array())
224221
{
225222
if (null !== $this->dispatcher) {
226-
$event = new Event($subject, $marking, $transition);
223+
$event = new Event($subject, $marking, $transition, $eventArguments);
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 $eventArguments = 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, $eventArguments);
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 $eventArguments
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 $eventArguments = 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, $eventArguments)) {
297295
return $transition;
298296
}
299297
}

0 commit comments

Comments
 (0)
0