Hasan Teymoori
Hasan Teymoori

Reputation: 192

laravel broadcasting for multiple guard

I have the below auth guards that is defined for my app admins, designers, customers and etc. the default guard is the designer guard.

I want every guard to have his own private channel. So I am defining it in my channel.php with multiple entries for each like below

Broadcast::channel('private.admins.{id}', function ($admin, $id) {


    Log::info($admin);
    //logging the admin

});

But this is always binding with default guard class so my question is how do I tell that to use here Admin model. I am unable to find it anywhere. So can you point me in to right direction

Actually I want every guard to have his own private channel.

Upvotes: 5

Views: 4050

Answers (2)

Hadi Aghandeh
Hadi Aghandeh

Reputation: 862

I am Posting this answer, For every one who might face the problem no-days. I am using laravel 7 and beyondcode/laravel-websockets. As I dig in the source code specifying midllewares in BoradcastServiceProvider.php will not work. The only way to define a guard for a channel is by specifying options for the channel:

 Broadcast::channel('messaging.organ.{id}', function ($organ , $id) {
    return $organ->id == $id && get_class($organ) === "App\Organization";
} , ['guards' => ['organ']]);

Reason: because I am using beyondcode/laravel-websockets so I dig in src/Illuminate/Broadcasting/Broadcasters/PusherBroadcaster.php and in this file the retrieveUser method will get the user. in this file if an option for the channel is provided the user in the specified guards will be returned. you can define one or multiple guards, however it will only returns one user who is logged in as a guard that comes first in the array.

    protected function retrieveUser($request, $channel)
{
    $options = $this->retrieveChannelOptions($channel);

    $guards = $options['guards'] ?? null;

    if (is_null($guards)) {
        return $request->user();
    }

    foreach (Arr::wrap($guards) as $guard) {
        if ($user = $request->user($guard)) {
            return $user;
        }
    }
}

Upvotes: 2

rkj
rkj

Reputation: 8297

Try changing in BroadcastServiceProvider file app\Providers\BroadcastServiceProvider.php

Different broadcast auth end point for each guards

public function boot()
{
   //Broadcast::routes();
   //match any of the 3 auth guards
   Broadcast::routes(['middleware' => ['web','auth:admins,designers,customers']]);
   require base_path('routes/channels.php');
}

Now in channels.php

Broadcast::channel('admins.channel.{id}', function ($model, $id) {
      return $model->id === $id && get_class($model) === 'App\Admin';
});

Broadcast::channel('designers.channel.{id}', function ($model, $id) {
      return $model->id === $id && get_class($model) === 'App\Designer';
});

Broadcast::channel('customers.channel.{id}', function ($model, $id) {
      return $model->id === $id && get_class($model) === 'App\Customer';
});

Upvotes: 10

Related Questions