laravel广播的多重卫兵

时间:2018-06-24 05:08:36

标签: php laravel socket.io broadcast

我具有以下为我的应用adminsdesignerscustomers等定义的身份验证防护。默认防护是designer guard

我希望每个guard都有自己的private channel。 因此,我在channel.php中定义了它,每个条目都有多个条目,如下所示:

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


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

});

但这始终是binding类的default guard,所以我的问题是如何告诉我在Admin model中使用它。 我在任何地方都找不到。那么你能指出我正确的方向吗?

实际上,我希望每个guard都有自己的private channel

2 个答案:

答案 0 :(得分:4)

尝试在BroadcastServiceProvider文件app\Providers\BroadcastServiceProvider.php中进行更改

  

每个警卫的广播授权端点不同

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');
}
  

现在在channels.php中

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

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

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

答案 1 :(得分:1)

我正在发布此答案,对于可能每天都遇到问题的每个人。我正在使用laravel 7和beyondcode/laravel-websockets。当我在源代码中进行挖掘时,在BoradcastServiceProvider.php中指定中间件将不起作用。定义通道防护的唯一方法是通过指定通道选项:

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

原因: 因为我正在使用beyondcode/laravel-websockets,所以我在src/Illuminate/Broadcasting/Broadcasters/PusherBroadcaster.php中进行挖掘,并且在此文件中,retrieveUser方法将吸引用户。在此文件中,如果提供了通道选项,将返回指定防护中的用户。您可以定义一个或多个防护,但是它只会返回以阵列中第一位防护方式登录的一个用户。

    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;
        }
    }
}