mirror of
https://github.com/archtechx/tenancy.git
synced 2026-02-05 13:14:05 +00:00
Add BroadcastTenancyBootstrapper and TenancyBroadcastManager
This commit is contained in:
parent
7d3298c6bb
commit
9834684402
2 changed files with 140 additions and 0 deletions
86
src/Bootstrappers/BroadcastTenancyBootstrapper.php
Normal file
86
src/Bootstrappers/BroadcastTenancyBootstrapper.php
Normal file
|
|
@ -0,0 +1,86 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Stancl\Tenancy\Bootstrappers;
|
||||||
|
|
||||||
|
use Illuminate\Config\Repository;
|
||||||
|
use Stancl\Tenancy\Contracts\Tenant;
|
||||||
|
use Illuminate\Foundation\Application;
|
||||||
|
use Stancl\Tenancy\TenancyBroadcastManager;
|
||||||
|
use Illuminate\Broadcasting\BroadcastManager;
|
||||||
|
use Stancl\Tenancy\Contracts\TenancyBootstrapper;
|
||||||
|
|
||||||
|
class BroadcastTenancyBootstrapper implements TenancyBootstrapper
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Tenant properties to be mapped to config (similarly to the TenantConfig feature).
|
||||||
|
*
|
||||||
|
* For example:
|
||||||
|
* [
|
||||||
|
* 'config.key.name' => 'tenant_property',
|
||||||
|
* ]
|
||||||
|
*/
|
||||||
|
public static array $credentialsMap = [];
|
||||||
|
|
||||||
|
public static string|null $broadcaster = null;
|
||||||
|
|
||||||
|
protected array $originalConfig = [];
|
||||||
|
|
||||||
|
public static array $mapPresets = [
|
||||||
|
'pusher' => [
|
||||||
|
'broadcasting.connections.pusher.key' => 'pusher_key',
|
||||||
|
'broadcasting.connections.pusher.secret' => 'pusher_secret',
|
||||||
|
'broadcasting.connections.pusher.app_id' => 'pusher_app_id',
|
||||||
|
'broadcasting.connections.pusher.options.cluster' => 'pusher_cluster',
|
||||||
|
],
|
||||||
|
'ably' => [
|
||||||
|
'broadcasting.connections.ably.key' => 'ably_key',
|
||||||
|
'broadcasting.connections.ably.public' => 'ably_public',
|
||||||
|
],
|
||||||
|
];
|
||||||
|
|
||||||
|
public function __construct(
|
||||||
|
protected Repository $config,
|
||||||
|
protected Application $app
|
||||||
|
) {
|
||||||
|
static::$broadcaster ??= $config->get('broadcasting.default');
|
||||||
|
static::$credentialsMap = array_merge(static::$credentialsMap, static::$mapPresets[static::$broadcaster] ?? []);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function bootstrap(Tenant $tenant): void
|
||||||
|
{
|
||||||
|
$this->setConfig($tenant);
|
||||||
|
|
||||||
|
$this->app->extend(BroadcastManager::class, function (BroadcastManager $broadcastManager) {
|
||||||
|
$tenancyBroadcastManager = new TenancyBroadcastManager($this->app);
|
||||||
|
|
||||||
|
return $tenancyBroadcastManager->setDriver($broadcastManager->getDefaultDriver(), $broadcastManager->driver());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public function revert(): void
|
||||||
|
{
|
||||||
|
$this->unsetConfig();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function setConfig(Tenant $tenant): void
|
||||||
|
{
|
||||||
|
foreach (static::$credentialsMap as $configKey => $storageKey) {
|
||||||
|
$override = $tenant->$storageKey;
|
||||||
|
|
||||||
|
if (array_key_exists($storageKey, $tenant->getAttributes())) {
|
||||||
|
$this->originalConfig[$configKey] ??= $this->config->get($configKey);
|
||||||
|
|
||||||
|
$this->config->set($configKey, $override);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function unsetConfig(): void
|
||||||
|
{
|
||||||
|
foreach ($this->originalConfig as $key => $value) {
|
||||||
|
$this->config->set($key, $value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
54
src/Bootstrappers/TenancyBroadcastManager.php
Normal file
54
src/Bootstrappers/TenancyBroadcastManager.php
Normal file
|
|
@ -0,0 +1,54 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Stancl\Tenancy; // todo new Overrides namespace?
|
||||||
|
|
||||||
|
use Illuminate\Broadcasting\BroadcastManager;
|
||||||
|
use Illuminate\Broadcasting\Broadcasters\Broadcaster;
|
||||||
|
use Illuminate\Contracts\Broadcasting\Broadcaster as BroadcasterContract;
|
||||||
|
|
||||||
|
class TenancyBroadcastManager extends BroadcastManager
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Broadcasters to always resolve from the container (even when they're
|
||||||
|
* cached and available in the $broadcasters property).
|
||||||
|
*/
|
||||||
|
public static array $tenantBroadcasters = ['pusher', 'ably'];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Override the get method so that the broadcasters in $tenantBroadcasters always get resolved,
|
||||||
|
* even when they're cached and available in the $broadcasters property.
|
||||||
|
*/
|
||||||
|
protected function get($name)
|
||||||
|
{
|
||||||
|
if (in_array($name, static::$tenantBroadcasters)) {
|
||||||
|
/** @var Broadcaster|null $cachedBroadcaster */
|
||||||
|
$cachedBroadcaster = $this->drivers[$name] ?? null;
|
||||||
|
|
||||||
|
$this->app->forgetInstance(BroadcasterContract::class);
|
||||||
|
|
||||||
|
/** @var Broadcaster $broadcaster */
|
||||||
|
$broadcaster = $this->resolve($name);
|
||||||
|
|
||||||
|
if ($cachedBroadcaster) {
|
||||||
|
$cachedBroadcaster = invade($cachedBroadcaster);
|
||||||
|
|
||||||
|
foreach ($cachedBroadcaster->channels as $channel => $callback) {
|
||||||
|
$broadcaster->channel($channel, $callback, $cachedBroadcaster->retrieveChannelOptions($channel));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $broadcaster;
|
||||||
|
}
|
||||||
|
|
||||||
|
return parent::get($name);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setDriver(string $name, BroadcasterContract $broadcaster): static
|
||||||
|
{
|
||||||
|
$this->drivers[$name] = $broadcaster;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue