mirror of
https://github.com/archtechx/tenancy.git
synced 2025-12-12 21:34:04 +00:00
Improve file structure (#5)
* Add Enums and Overrides folders * Fix code style (php-cs-fixer) --------- Co-authored-by: PHP CS Fixer <phpcsfixer@example.com>
This commit is contained in:
parent
1d0ca27bc8
commit
e3b59ae2b5
26 changed files with 33 additions and 32 deletions
|
|
@ -1,65 +0,0 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Stancl\Tenancy; // todo new Overrides namespace?
|
||||
|
||||
use Illuminate\Broadcasting\Broadcasters\Broadcaster;
|
||||
use Illuminate\Broadcasting\BroadcastManager;
|
||||
use Illuminate\Contracts\Broadcasting\Broadcaster as BroadcasterContract;
|
||||
use Illuminate\Contracts\Foundation\Application;
|
||||
|
||||
class TenancyBroadcastManager extends BroadcastManager
|
||||
{
|
||||
/**
|
||||
* Names of broadcasters to always recreate using $this->resolve() (even when they're
|
||||
* cached and available in the $broadcasters property).
|
||||
*
|
||||
* The reason for recreating the broadcasters is
|
||||
* to make your app use the correct broadcaster credentials when tenancy is initialized.
|
||||
*/
|
||||
public static array $tenantBroadcasters = ['pusher', 'ably'];
|
||||
|
||||
/**
|
||||
* Override the get method so that the broadcasters in $tenantBroadcasters
|
||||
* always get freshly resolved even when they're cached and available in the $broadcasters property,
|
||||
* and that the resolved broadcaster will override the BroadcasterContract::class singleton.
|
||||
*
|
||||
* If there's a cached broadcaster with the same name as $name,
|
||||
* give its channels to the newly resolved bootstrapper.
|
||||
*/
|
||||
protected function get($name)
|
||||
{
|
||||
if (in_array($name, static::$tenantBroadcasters)) {
|
||||
/** @var Broadcaster|null $originalBroadcaster */
|
||||
$originalBroadcaster = $this->app->make(BroadcasterContract::class);
|
||||
$newBroadcaster = $this->resolve($name);
|
||||
|
||||
// If there is a current broadcaster, give its channels to the newly resolved one
|
||||
// Broadcasters only have to implement the Illuminate\Contracts\Broadcasting\Broadcaster contract
|
||||
// Which doesn't require the channels property
|
||||
// So passing the channels is only needed for Illuminate\Broadcasting\Broadcasters\Broadcaster instances
|
||||
if ($originalBroadcaster instanceof Broadcaster && $newBroadcaster instanceof Broadcaster) {
|
||||
$this->passChannelsFromOriginalBroadcaster($originalBroadcaster, $newBroadcaster);
|
||||
}
|
||||
|
||||
$this->app->singleton(BroadcasterContract::class, fn (Application $app) => $newBroadcaster);
|
||||
|
||||
return $newBroadcaster;
|
||||
}
|
||||
|
||||
return parent::get($name);
|
||||
}
|
||||
|
||||
// Because, unlike the original broadcaster, the newly resolved broadcaster won't have the channels registered using routes/channels.php
|
||||
// Using it for broadcasting won't work, unless we make it have the original broadcaster's channels
|
||||
protected function passChannelsFromOriginalBroadcaster(Broadcaster $originalBroadcaster, Broadcaster $newBroadcaster): void
|
||||
{
|
||||
// invade() because channels can't be retrieved through any of the broadcaster's public methods
|
||||
$originalBroadcaster = invade($originalBroadcaster);
|
||||
|
||||
foreach ($originalBroadcaster->channels as $channel => $callback) {
|
||||
$newBroadcaster->channel($channel, $callback, $originalBroadcaster->retrieveChannelOptions($channel));
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue