Skip to content

Commit 2075d9e

Browse files
committed
Merge pull request #113 from php-school/hotfix/event-trigger-order
verifiers and events should trigger in correct order
2 parents 0577b22 + ee711ce commit 2075d9e

File tree

2 files changed

+50
-32
lines changed

2 files changed

+50
-32
lines changed

src/Event/EventDispatcher.php

Lines changed: 12 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
namespace PhpSchool\PhpWorkshop\Event;
44

5-
use Assert\Assertion;
65
use PhpSchool\PhpWorkshop\Result\ResultInterface;
76
use PhpSchool\PhpWorkshop\ResultAggregator;
87

@@ -18,11 +17,6 @@ class EventDispatcher
1817
*/
1918
private $listeners = [];
2019

21-
/**
22-
* @var array
23-
*/
24-
private $verifiers = [];
25-
2620
/**
2721
* @var ResultAggregator
2822
*/
@@ -48,19 +42,6 @@ public function dispatch(EventInterface $event)
4842
}
4943
}
5044

51-
if (array_key_exists($event->getName(), $this->verifiers)) {
52-
foreach ($this->verifiers[$event->getName()] as $verifier) {
53-
$result = $verifier($event);
54-
55-
//return type hints pls
56-
if ($result instanceof ResultInterface) {
57-
$this->resultAggregator->add($result);
58-
} else {
59-
//??!!
60-
}
61-
}
62-
}
63-
6445
return $event;
6546
}
6647

@@ -94,14 +75,19 @@ private function attachListener($eventName, callable $callback)
9475

9576
/**
9677
* @param string $eventName
97-
* @param callable $callback
78+
* @param callable $verifier
9879
*/
99-
public function insertVerifier($eventName, callable $callback)
80+
public function insertVerifier($eventName, callable $verifier)
10081
{
101-
if (!array_key_exists($eventName, $this->verifiers)) {
102-
$this->verifiers[$eventName] = [$callback];
103-
} else {
104-
$this->verifiers[$eventName][] = $callback;
105-
}
82+
$this->attachListener($eventName, function (EventInterface $event) use ($verifier) {
83+
$result = $verifier($event);
84+
85+
//return type hints pls
86+
if ($result instanceof ResultInterface) {
87+
$this->resultAggregator->add($result);
88+
} else {
89+
//??!!
90+
}
91+
});
10692
}
10793
}

test/Event/EventDispatcherTest.php

Lines changed: 38 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use PhpSchool\PhpWorkshop\Event\Event;
66
use PhpSchool\PhpWorkshop\Event\EventDispatcher;
7+
use PhpSchool\PhpWorkshop\Event\EventInterface;
78
use PhpSchool\PhpWorkshop\Result\ResultInterface;
89
use PhpSchool\PhpWorkshop\ResultAggregator;
910
use PHPUnit_Framework_TestCase;
@@ -44,9 +45,15 @@ public function testOnlyAppropriateListenersAreCalledForEvent()
4445
$mockCallback2->expects($this->never())
4546
->method('doNotInvokeMe');
4647

47-
$this->eventDispatcher->listen('some-event', [$mockCallback1, 'callback']);
48-
$this->eventDispatcher->listen('some-event', [$mockCallback1, 'callback']);
49-
$this->eventDispatcher->listen('different-event', [$mockCallback2, 'doNotInvokeMe']);
48+
$cb = function (Event $e) use ($mockCallback1) {
49+
$mockCallback1->callback($e);
50+
};
51+
52+
$this->eventDispatcher->listen('some-event', $cb);
53+
$this->eventDispatcher->listen('some-event', $cb);
54+
$this->eventDispatcher->listen('different-event', function (Event $e) use ($mockCallback2) {
55+
$mockCallback2->doNotInvokeMe($e);
56+
});
5057
$this->eventDispatcher->dispatch($e);
5158
}
5259

@@ -61,8 +68,12 @@ public function testOnlyAppropriateVerifiersAreCalledForEvent()
6168
->with($e)
6269
->will($this->returnValue($result));
6370

64-
$this->eventDispatcher->insertVerifier('some-event', [$mockCallback1, 'callback']);
65-
$this->eventDispatcher->insertVerifier('some-event', [$mockCallback1, 'callback']);
71+
$cb = function (Event $e) use ($mockCallback1) {
72+
return $mockCallback1->callback($e);
73+
};
74+
75+
$this->eventDispatcher->insertVerifier('some-event', $cb);
76+
$this->eventDispatcher->insertVerifier('some-event', $cb);
6677
$this->eventDispatcher->dispatch($e);
6778

6879
$this->assertEquals([$result, $result], iterator_to_array($this->results));
@@ -77,7 +88,9 @@ public function testVerifyReturnIsSkippedIfNotInstanceOfResult()
7788
->with($e)
7889
->will($this->returnValue(null));
7990

80-
$this->eventDispatcher->insertVerifier('some-event', [$mockCallback1, 'callback']);
91+
$this->eventDispatcher->insertVerifier('some-event', function (Event $e) use ($mockCallback1) {
92+
$mockCallback1->callback($e);
93+
});
8194
$this->eventDispatcher->dispatch($e);
8295

8396
$this->assertEquals([], iterator_to_array($this->results));
@@ -97,4 +110,23 @@ public function testListenWithMultipleEvents()
97110
$this->eventDispatcher->dispatch($e1);
98111
$this->eventDispatcher->dispatch($e2);
99112
}
113+
114+
public function testListenersAndVerifiersAreCalledInOrderOfAttachment()
115+
{
116+
$e1 = new Event('first-event', ['arg1' => 1, 'arg2' => 2]);
117+
118+
119+
$counter = 0;
120+
$this->eventDispatcher->insertVerifier('first-event', function (Event $e) use (&$counter) {
121+
$this->assertEquals(0, $counter);
122+
$counter++;
123+
});
124+
125+
$this->eventDispatcher->listen('first-event', function (Event $e) use (&$counter) {
126+
$this->assertEquals(1, $counter);
127+
$counter++;
128+
});
129+
130+
$this->eventDispatcher->dispatch($e1);
131+
}
100132
}

0 commit comments

Comments
 (0)