diff --git a/src/Events/Dispatcher.php b/src/Events/Dispatcher.php index db5e9b934..d67c46f67 100644 --- a/src/Events/Dispatcher.php +++ b/src/Events/Dispatcher.php @@ -48,11 +48,10 @@ public function listen($events, $listener = null, $priority = 0) } elseif ($listener instanceof QueuedClosure) { $listener = $listener->resolve(); } - $listener = Serialization::wrapClosure($listener); foreach ((array) $events as $event) { if (Str::contains($event, '*')) { - $this->setupWildcardListen($event, $listener); + $this->setupWildcardListen($event, Serialization::wrapClosure($listener)); } else { $this->listeners[$event][$priority][] = $this->makeListener($listener); @@ -61,6 +60,14 @@ public function listen($events, $listener = null, $priority = 0) } } + // Serialize the listener created by laravel + public function makeListener($listener, $wildcard = false) + { + $listener = parent::makeListener($listener, $wildcard); + + return Serialization::wrapClosure($listener); + } + /** * Get the event that is currently firing. * @@ -127,9 +134,6 @@ public function dispatch($event, $payload = [], $halt = false) } foreach ($this->getListeners($event) as $listener) { - if ($listener instanceof SerializableClosure) { - $listener = $listener->getClosure(); - } $response = $listener($event, $payload); // If a response is returned from the listener and event halting is enabled diff --git a/tests/Events/DispatcherTest.php b/tests/Events/DispatcherTest.php index c48005a42..2cf08f419 100644 --- a/tests/Events/DispatcherTest.php +++ b/tests/Events/DispatcherTest.php @@ -53,6 +53,32 @@ public function testTypedClosureListen() $this->assertTrue($magic_value); } + public function testClosureWithValueArgument() + { + $original = false; + + $dispatcher = new Dispatcher(); + $dispatcher->listen('test', function ($value) { + $value = true; + }); + $dispatcher->dispatch('test', [$original]); + + $this->assertFalse($original); + } + + public function testClosureWithReferenceArgument() + { + $original = false; + + $dispatcher = new Dispatcher(); + $dispatcher->listen('test', function (&$value) { + $value = true; + }); + $dispatcher->dispatch('test', [&$original]); + + $this->assertTrue($original); + } + public function testStringEventPriorities() { $magic_value = 0;