mirror of
https://github.com/archtechx/tenancy.git
synced 2026-05-06 22:24:04 +00:00
BroadcastingConfigBootstrapper and TenancyBroadcastManager: comments
This commit is contained in:
parent
29dd23db61
commit
4937a74ed5
2 changed files with 35 additions and 13 deletions
|
|
@ -14,6 +14,12 @@ use Stancl\Tenancy\Contracts\TenancyBootstrapper;
|
||||||
use Stancl\Tenancy\Contracts\Tenant;
|
use Stancl\Tenancy\Contracts\Tenant;
|
||||||
use Stancl\Tenancy\Overrides\TenancyBroadcastManager;
|
use Stancl\Tenancy\Overrides\TenancyBroadcastManager;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Maps tenant properties to broadcasting config and overrides
|
||||||
|
* the BroadcastManager binding with TenancyBroadcastManager in tenant context.
|
||||||
|
*
|
||||||
|
* @see TenancyBroadcastManager
|
||||||
|
*/
|
||||||
class BroadcastingConfigBootstrapper implements TenancyBootstrapper
|
class BroadcastingConfigBootstrapper implements TenancyBootstrapper
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
|
|
@ -66,13 +72,15 @@ class BroadcastingConfigBootstrapper implements TenancyBootstrapper
|
||||||
|
|
||||||
$this->setConfig($tenant);
|
$this->setConfig($tenant);
|
||||||
|
|
||||||
// Make BroadcastManager resolve to TenancyBroadcastManager which always re-resolves the used broadcasters (so that
|
// Make BroadcastManager resolve to TenancyBroadcastManager which always re-resolves the used broadcasters so that
|
||||||
// the broadcasting credentials are always up-to-date at the point of broadcasting) and gives the channels of
|
// the credentials used by broadcasters are always up-to-date with the config when retrieving the broadcasters using
|
||||||
// the broadcaster from the central context to the newly resolved broadcasters in tenant context.
|
// the manager and gives the channels of the broadcaster from central context to the newly resolved broadcasters in tenant context.
|
||||||
$this->app->extend(BroadcastManager::class, function (BroadcastManager $broadcastManager) {
|
$this->app->extend(BroadcastManager::class, function (BroadcastManager $broadcastManager) {
|
||||||
$originalCustomCreators = invade($broadcastManager)->customCreators;
|
$originalCustomCreators = invade($broadcastManager)->customCreators;
|
||||||
$tenantBroadcastManager = new TenancyBroadcastManager($this->app);
|
$tenantBroadcastManager = new TenancyBroadcastManager($this->app);
|
||||||
|
|
||||||
|
// TenancyBroadcastManager inherits the custom driver creators registered in the central context so that
|
||||||
|
// custom drivers work in tenant context without having to re-register the creators manually.
|
||||||
foreach ($originalCustomCreators as $driver => $closure) {
|
foreach ($originalCustomCreators as $driver => $closure) {
|
||||||
$tenantBroadcastManager->extend($driver, $closure);
|
$tenantBroadcastManager->extend($driver, $closure);
|
||||||
}
|
}
|
||||||
|
|
@ -81,16 +89,17 @@ class BroadcastingConfigBootstrapper implements TenancyBootstrapper
|
||||||
});
|
});
|
||||||
|
|
||||||
// Swap currently bound Broadcaster instance for one that's resolved through the tenant broadcast manager.
|
// Swap currently bound Broadcaster instance for one that's resolved through the tenant broadcast manager.
|
||||||
// Note that changing tenant's credentials in tenant context doesn't update them in the bound Broadcaster instance.
|
// Note that updating broadcasting config (credentials) in tenant context doesn't update the credentials
|
||||||
// If you need to e.g. send a notification in response to updating tenant's broadcasting credentials in tenant context,
|
// used by the bound Broadcaster instance. If you need to e.g. send a notification in response to
|
||||||
// it's recommended to use the broadcast() helper which always uses fresh broadcasters with the current credentials.
|
// updating tenant's broadcasting credentials in tenant context, it's recommended to
|
||||||
|
// reinitialize tenancy after updating the credentials.
|
||||||
$this->app->extend(Broadcaster::class, function (Broadcaster $broadcaster) {
|
$this->app->extend(Broadcaster::class, function (Broadcaster $broadcaster) {
|
||||||
return $this->app->make(BroadcastManager::class)->connection();
|
return $this->app->make(BroadcastManager::class)->connection();
|
||||||
});
|
});
|
||||||
|
|
||||||
// Clear the resolved Broadcast facade's Illuminate\Contracts\Broadcasting\Factory instance
|
// Clear the resolved Broadcast facade's Illuminate\Contracts\Broadcasting\Factory instance
|
||||||
// so that it gets re-resolved as the tenant broadcast manager when used (e.g. the
|
// so that it gets re-resolved as TenancyBroadcastManager instead of the central BroadcastManager
|
||||||
// Broadcast::auth() call in BroadcastController::authenticate).
|
// when used e.g. in the Broadcast::auth() call in BroadcastController::authenticate (/broadcasting/auth).
|
||||||
Broadcast::clearResolvedInstance(BroadcastingFactory::class);
|
Broadcast::clearResolvedInstance(BroadcastingFactory::class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,13 +8,26 @@ use Illuminate\Broadcasting\Broadcasters\Broadcaster;
|
||||||
use Illuminate\Broadcasting\BroadcastManager;
|
use Illuminate\Broadcasting\BroadcastManager;
|
||||||
use Illuminate\Contracts\Broadcasting\Broadcaster as BroadcasterContract;
|
use Illuminate\Contracts\Broadcasting\Broadcaster as BroadcasterContract;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* BroadcastManager override that always re-resolves the broadcasters in static::$tenantBroadcasters
|
||||||
|
* when attempting to retrieve them and passes the channels of the original (central) broadcaster
|
||||||
|
* to the broadcasters newly resolved in tenant context.
|
||||||
|
*
|
||||||
|
* Affects calls that use app(BroadcastManager::class)->get().
|
||||||
|
*
|
||||||
|
* @see Stancl\Tenancy\Bootstrappers\BroadcastingConfigBootstrapper
|
||||||
|
*/
|
||||||
class TenancyBroadcastManager extends BroadcastManager
|
class TenancyBroadcastManager extends BroadcastManager
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Names of broadcasters that
|
* Names of broadcasters that
|
||||||
* - should always be recreated using $this->resolve(), even when they're cached and available
|
* - should always be recreated using $this->resolve(), even when they're cached and available
|
||||||
* in $this->drivers (so that e.g. when you update broadcasting credentials in the tenant context,
|
* in $this->drivers so that when you update broadcasting config in the tenant context,
|
||||||
* the updated credentials will be used for broadcasting in the same context)
|
* the updated config/credentials will be used for broadcasting in the same context.
|
||||||
|
* Note that in cases like this, only direct config changes are reflected immediately.
|
||||||
|
* For the broadcasters to reflect tenant property changes made in tenant context,
|
||||||
|
* you still have to reinitialize tenancy after updating the tenant properties intended
|
||||||
|
* for broadcasting config mapping, since the properties are only mapped to config on BroadcastingConfigBootstrapper::bootstrap().
|
||||||
* - should inherit the original broadcaster's channels (= the channels registered in
|
* - should inherit the original broadcaster's channels (= the channels registered in
|
||||||
* the central context, e.g. in routes/channels.php, before this manager overrides the bound BroadcastManager).
|
* the central context, e.g. in routes/channels.php, before this manager overrides the bound BroadcastManager).
|
||||||
*/
|
*/
|
||||||
|
|
@ -46,9 +59,9 @@ class TenancyBroadcastManager extends BroadcastManager
|
||||||
}
|
}
|
||||||
|
|
||||||
// The newly resolved broadcasters don't automatically receive the channels registered
|
// The newly resolved broadcasters don't automatically receive the channels registered
|
||||||
// in central context (e.g. in routes/channels.php), so the channels have to be obtained from the
|
// in central context (e.g. Broadcast::channel() in routes/channels.php), so the channels
|
||||||
// broadcaster used in central context and manually passed to the new broadcasters
|
// have to be obtained from the original (central) broadcaster and manually passed to the new broadcasters
|
||||||
// (attempting to broadcast using a broadcaster with no channels results in a 403 error).
|
// (broadcasting using a broadcaster with no channels results in a 403 error on Broadcast::auth()).
|
||||||
protected function passChannelsFromOriginalBroadcaster(Broadcaster $originalBroadcaster, Broadcaster $newBroadcaster): void
|
protected function passChannelsFromOriginalBroadcaster(Broadcaster $originalBroadcaster, Broadcaster $newBroadcaster): void
|
||||||
{
|
{
|
||||||
// invade() because channels can't be retrieved through any of the broadcaster's public methods
|
// invade() because channels can't be retrieved through any of the broadcaster's public methods
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue