From 80155331e8226b808e5b28fa5f1930be84998478 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Samuel=20=C5=A0tancl?= Date: Sun, 29 Sep 2019 13:29:05 +0200 Subject: [PATCH] Revert "Remove events trait" This reverts commit ce7fa775e23d28421875e6ea66ca75e8c52cb7d5. --- src/Traits/TenantManagerEvents.php | 129 +++++++++++++++++++++++++++++ 1 file changed, 129 insertions(+) create mode 100644 src/Traits/TenantManagerEvents.php diff --git a/src/Traits/TenantManagerEvents.php b/src/Traits/TenantManagerEvents.php new file mode 100644 index 00000000..d10ece26 --- /dev/null +++ b/src/Traits/TenantManagerEvents.php @@ -0,0 +1,129 @@ + [], + 'bootstrapped' => [], + 'ending' => [], + 'ended' => [], + ]; + + /** + * Integration listeners. + * + * @var callable[][] + */ + protected $integrationListeners = []; + + /** + * Register a listener that will be executed before tenancy is bootstrapped. + * + * @param callable $callback + * @return self + */ + public function bootstrapping(callable $callback) + { + $this->listeners['bootstrapping'][] = $callback; + + return $this; + } + + /** + * Register a listener that will be executed after tenancy is bootstrapped. + * + * @param callable $callback + * @return self + */ + public function bootstrapped(callable $callback) + { + $this->listeners['bootstrapped'][] = $callback; + + return $this; + } + + /** + * Register a listener that will be executed before tenancy is ended. + * + * @param callable $callback + * @return self + */ + public function ending(callable $callback) + { + $this->listeners['ending'][] = $callback; + + return $this; + } + + /** + * Register a listener that will be executed after tenancy is ended. + * + * @param callable $callback + * @return self + */ + public function ended(callable $callback) + { + $this->listeners['ended'][] = $callback; + + return $this; + } + + /** + * Fire an event. + * + * @param string $name Event name + * @return Collection Prevented events + */ + public function event(string $name): Collection + { + return \array_reduce($this->listeners[$name], function ($prevents, $listener) { + return $prevents->merge($listener($this) ?? []); + }, collect([])); + } + + /** + * Register a callback for an integration event. + * + * @param string $name + * @param callable $callback + * @return void + */ + public function integrationEvent(string $name, callable $callback) + { + if (\array_key_exists($name, $this->integrationListeners)) { + $this->integrationListeners[$name][] = $callback; + } else { + $this->integrationListeners[$name] = [$callback]; + } + } + + /** + * Return callbacks for an integration event. + * + * @param string $name + * @param mixed $arguments,... + * @return callable[] + */ + public function integration(string $name, ...$arguments) + { + if ($arguments) { + // If $arguments are supplied, execute all listeners with arguments. + return \array_reduce($this->integrationListeners[$name] ?? [], function ($tags, $listener) use ($arguments) { + return \array_merge($tags, $listener(...$arguments)); + }, []); + } + + return $this->integrationListeners[$name]; + } +}