From 9e249111b0e64f35e4528eb3ba06b5af074d3c91 Mon Sep 17 00:00:00 2001 From: Frank de Jonge Date: Fri, 24 Nov 2023 10:47:59 +0100 Subject: [PATCH] WIP --- src/BufferedEventDispatcher.php | 29 +++++++++++++++++++++++++ src/EventDispatcher.php | 27 +++++++++++++++++++++++ src/ListenerRegistry.php | 5 +++++ src/UnableToUnsubscribeListener.php | 33 +++++++++++++++++++++++++++++ 4 files changed, 94 insertions(+) create mode 100644 src/UnableToUnsubscribeListener.php diff --git a/src/BufferedEventDispatcher.php b/src/BufferedEventDispatcher.php index 6de5327..24aa4df 100644 --- a/src/BufferedEventDispatcher.php +++ b/src/BufferedEventDispatcher.php @@ -70,4 +70,33 @@ public function subscribeListenersFrom(ListenerSubscriber $subscriber): void $this->dispatcher->subscribeListenersFrom($subscriber); } + + + + public function unsubscribeFor(string $event, callable $listener): void + { + if ( ! $this->dispatcher instanceof ListenerRegistry) { + throw UnableToUnsubscribeListener::becauseTheEventDispatcherIsNotARegistry($this->dispatcher); + } + + $this->dispatcher->unsubscribeFor($event, $listener); + } + + public function unsubscribeAllFor(string $event): void + { + if ( ! $this->dispatcher instanceof ListenerRegistry) { + throw UnableToUnsubscribeListener::becauseTheEventDispatcherIsNotARegistry($this->dispatcher); + } + + $this->dispatcher->unsubscribeAllFor($event); + } + + public function unsubscribeAll(callable $listener): void + { + if ( ! $this->dispatcher instanceof ListenerRegistry) { + throw UnableToUnsubscribeListener::becauseTheEventDispatcherIsNotARegistry($this->dispatcher); + } + + $this->dispatcher->unsubscribeAll($listener); + } } diff --git a/src/EventDispatcher.php b/src/EventDispatcher.php index 6c5128f..f41c647 100644 --- a/src/EventDispatcher.php +++ b/src/EventDispatcher.php @@ -83,4 +83,31 @@ public function subscribeListenersFrom(ListenerSubscriber $subscriber): void $this->listenerProvider->subscribeListenersFrom($subscriber); } + + public function unsubscribeFor(string $event, callable $listener): void + { + if ( ! $this->listenerProvider instanceof ListenerRegistry) { + throw UnableToUnsubscribeListener::becauseTheListenerProviderIsNotARegistry($this->listenerProvider); + } + + $this->listenerProvider->unsubscribeFor($event, $listener); + } + + public function unsubscribeAllFor(string $event): void + { + if ( ! $this->listenerProvider instanceof ListenerRegistry) { + throw UnableToUnsubscribeListener::becauseTheListenerProviderIsNotARegistry($this->listenerProvider); + } + + $this->listenerProvider->unsubscribeAllFor($event); + } + + public function unsubscribeAll(callable $listener): void + { + if ( ! $this->listenerProvider instanceof ListenerRegistry) { + throw UnableToUnsubscribeListener::becauseTheListenerProviderIsNotARegistry($this->listenerProvider); + } + + $this->listenerProvider->unsubscribeAll($listener); + } } diff --git a/src/ListenerRegistry.php b/src/ListenerRegistry.php index a934a42..309d2ce 100644 --- a/src/ListenerRegistry.php +++ b/src/ListenerRegistry.php @@ -4,6 +4,11 @@ namespace League\Event; +/** + * @method void unsubscribeFor(string $event, callable $listener) + * @method void unsubscribeAll(callable $listener) + * @method void unsubscribeAllFor(string $event) + */ interface ListenerRegistry { public function subscribeTo(string $event, callable $listener, int $priority = ListenerPriority::NORMAL): void; diff --git a/src/UnableToUnsubscribeListener.php b/src/UnableToUnsubscribeListener.php new file mode 100644 index 0000000..67eb922 --- /dev/null +++ b/src/UnableToUnsubscribeListener.php @@ -0,0 +1,33 @@ +