Радиовещание для нескольких охранников
У меня есть следующие параметры безопасности, определенные для моего приложения admins
, designers
, customers
и т. д. по умолчанию охранник является 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
,
1 ответ
Попробуйте изменить в 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');
}
Сейчас в channel.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';
});
Я отправляю этот ответ для всех, кто может столкнуться с проблемой в любое время. Я использую 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;
}
}
}