1
0
Fork 0
mirror of https://github.com/archtechx/tenancy.git synced 2026-02-05 16:34:04 +00:00

Simplify BroadcastManager extension, remove setDriver method

This commit is contained in:
lukinovec 2022-12-15 09:06:43 +01:00
parent cfb7e9674c
commit b78a925f19
2 changed files with 13 additions and 23 deletions

View file

@ -60,12 +60,7 @@ class BroadcastTenancyBootstrapper implements TenancyBootstrapper
// Make BroadcastManager resolve to a custom BroadcastManager which makes the broadcasters use the tenant credentials // Make BroadcastManager resolve to a custom BroadcastManager which makes the broadcasters use the tenant credentials
$this->app->extend(BroadcastManager::class, function (BroadcastManager $broadcastManager) { $this->app->extend(BroadcastManager::class, function (BroadcastManager $broadcastManager) {
$tenancyBroadcastManager = new TenancyBroadcastManager($this->app); return 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());
}); });
} }

View file

@ -31,34 +31,29 @@ class TenancyBroadcastManager extends BroadcastManager
protected function get($name) protected function get($name)
{ {
if (in_array($name, static::$tenantBroadcasters)) { if (in_array($name, static::$tenantBroadcasters)) {
/** @var Broadcaster|null $cachedBroadcaster */
$cachedBroadcaster = $this->drivers[$name] ?? null;
/** @var Broadcaster $broadcaster */ /** @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 there is a current broadcaster, give its channels to the newly resolved one
if ($cachedBroadcaster) { if ($originalBroadcaster = $this->app->make(BroadcasterContract::class)) {
// invade() because channels can't be retrieved through any of the broadcaster's public methods $this->passChannelsFromOriginalBroadcaster($originalBroadcaster, $newBroadcaster);
$cachedBroadcaster = invade($cachedBroadcaster);
foreach ($cachedBroadcaster->channels as $channel => $callback) {
$broadcaster->channel($channel, $callback, $cachedBroadcaster->retrieveChannelOptions($channel));
}
} }
$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); 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));
}
} }
} }