diff --git a/src/Bootstrappers/BroadcastTenancyBootstrapper.php b/src/Bootstrappers/BroadcastTenancyBootstrapper.php index b21964da..2f625437 100644 --- a/src/Bootstrappers/BroadcastTenancyBootstrapper.php +++ b/src/Bootstrappers/BroadcastTenancyBootstrapper.php @@ -60,12 +60,7 @@ class BroadcastTenancyBootstrapper implements TenancyBootstrapper // Make BroadcastManager resolve to a custom BroadcastManager which makes the broadcasters use the tenant credentials $this->app->extend(BroadcastManager::class, function (BroadcastManager $broadcastManager) { - $tenancyBroadcastManager = new TenancyBroadcastManager($this->app); - - // Because the new custom TenancyBroadcastManager won't have the original broadcasters - // It also won't have the channels registered in routes/channels.php, and without these, broadcasting won't work - // So we pass the default broadcaster to the new TenancyBroadcastManager - return $tenancyBroadcastManager->setDriver($broadcastManager->getDefaultDriver(), $broadcastManager->driver()); + return new TenancyBroadcastManager($this->app); }); } diff --git a/src/TenancyBroadcastManager.php b/src/TenancyBroadcastManager.php index e5ae0f25..f1288bb9 100644 --- a/src/TenancyBroadcastManager.php +++ b/src/TenancyBroadcastManager.php @@ -31,34 +31,29 @@ class TenancyBroadcastManager extends BroadcastManager protected function get($name) { if (in_array($name, static::$tenantBroadcasters)) { - /** @var Broadcaster|null $cachedBroadcaster */ - $cachedBroadcaster = $this->drivers[$name] ?? null; - /** @var Broadcaster $broadcaster */ - $broadcaster = $this->resolve($name); + $newBroadcaster = $this->resolve($name); - // If there is a cached broadcaster, give its channels to the newly resolved one - if ($cachedBroadcaster) { - // invade() because channels can't be retrieved through any of the broadcaster's public methods - $cachedBroadcaster = invade($cachedBroadcaster); - - foreach ($cachedBroadcaster->channels as $channel => $callback) { - $broadcaster->channel($channel, $callback, $cachedBroadcaster->retrieveChannelOptions($channel)); - } + // If there is a current broadcaster, give its channels to the newly resolved one + if ($originalBroadcaster = $this->app->make(BroadcasterContract::class)) { + $this->passChannelsFromOriginalBroadcaster($originalBroadcaster, $newBroadcaster); } - $this->app->singleton(BroadcasterContract::class, fn (Application $app) => $broadcaster); + $this->app->singleton(BroadcasterContract::class, fn (Application $app) => $newBroadcaster); - return $broadcaster; + return $newBroadcaster; } return parent::get($name); } - public function setDriver(string $name, BroadcasterContract $broadcaster): static + protected function passChannelsFromOriginalBroadcaster(Broadcaster $originalBroadcaster, Broadcaster $newBroadcaster): void { - $this->drivers[$name] = $broadcaster; + // invade() because channels can't be retrieved through any of the broadcaster's public methods + $originalBroadcaster = invade($originalBroadcaster); - return $this; + foreach ($originalBroadcaster->channels as $channel => $callback) { + $newBroadcaster->channel($channel, $callback, $originalBroadcaster->retrieveChannelOptions($channel)); + } } }