Я работаю над проектом, в котором пользователи могут создавать общедоступные или частные группы.
Теперь я хочу отправлять уведомления о публикациях в реальном времени с помощью событий Laravel 11 Reverb.
Проблема в том, что пользователь, являющийся членом частной группы, может находиться где-то еще на сайте.
В этой ситуации у меня нет прямого доступа к идентификатору этой частной группы.
На этом этапе я защитил широковещательный канал, используя идентификатор группы, и это хороший подход, пока пользователь находится в частной группе. группа, и она не работает, когда пользователь находится в другой частной группе или где-то еще на веб-сайте.
Я попробовал несколько способов трансляции событий для пользователей, которые не активны в группе. Например, я защитил широковещательный канал с помощью идентификатора пользователя, а затем в контроллере прошёл через group->members()->chunk(), но этот подход для группы с большим количеством участников не подходит:
$this->group->members()->chunk(250, function ($users) use ($auth) {
foreach ($users as $user) {
if ($user->pivot->member_id === $user->id) {
broadcast(new GroupEvents(
$this->group,
$user,
$auth,
[
"refresh" => true,
"title" => "The {$this->group->name} group is being archived.",
"message" => "{$auth->full_name} has archived the {$this->group->name} group. All actions within this group are now disabled.",
]
))->toOthers();
}
}
});
Второй метод заключается в том, что я создаю уведомление, используя $user->notify(), а затем в глобальном макете во внешнем интерфейсе я использую Inertia usePoll() для обновления пользователь unread_notifications каждые 3 минуты.
ЕСЛИ пользователь находится в частной группе, он сразу же получит широковещательное уведомление, а если пользователь в этот момент не активен в группе, тогда они будут уведомлены через 3 минуты или в любое другое время, когда они активны на сайте.
Даже для этого метода мне все равно нужно просмотреть участников группы, чтобы подготовить для них уведомления.
Я был бы признателен за любые советы по улучшению этого решения или предложения по лучшему подходу к эффективно обрабатывайте уведомления для больших групп.
Заранее спасибо!
// channel.php
Broadcast::channel('group.events.{id}', function (User $user, $id) {
$group = Group::findOrNew($id);
return $user->address && $group->members()
->wherePivot('member_id', $user->id)
->exists();
});
//GroupEventsJob.php
public array $inputs;
public Group $group;
public User $user;
/**
* Create a new job instance.
*/
public function __construct($group, $user, array $data)
{
$this->inputs = $data;
$this->user = $user;
$this->group = $group;
}
/**
* Execute the job.
*/
public function handle(): void
{
$inputs = new Fluent($this->inputs);
broadcast(new GroupEvents(
$this->group,
$this->user,
[
"refresh" => $inputs->refresh,
"title" => $inputs->title,
"message" => $inputs->message,
]
))->toOthers();
$this->group->members()->chunk(250, function ($users) use ($inputs) {
foreach ($users as $user) {
if ($user->username !== $this->user->username) {
$user->notify(new \App\Notifications\GroupEvents([
"title" => $inputs->title,
"message" => $inputs->message,
"url" => null,
"group_id" => $this->group->uid
]));
if ($user->last_activity === null) {
$user->notifications()
->whereNull('popped_at')
->update(['popped_at' => now()]);
}
}
}
});
}
// GroupController.php
public function archive(string $group)
{
if (!$this->group->is_archived) {
$auth = auth()->user();
$this->group->is_archived = now();
$this->group->join_code = null;
$this->group->save();
dispatch(new GroupEventsJob(
$this->group,
$auth,
[
"refresh" => true,
"title" => "The {$this->group->name} group is being archived.",
"message" => "{$auth->full_name} has archived the {$this->group->name} group. All actions within this group are now disabled.",
]
));
inertia()->clearHistory();
return back()
->with('message', [
"type" => "success",
"content" => "The group has been successfully archived."
]);
}
}
Подробнее здесь: https://stackoverflow.com/questions/793 ... vate-group
Как вывести уведомления о событиях реверберации из частной группы? ⇐ Php
Кемеровские программисты php общаются здесь
-
Anonymous
1735542549
Anonymous
Я работаю над проектом, в котором пользователи могут создавать общедоступные или частные группы.
Теперь я хочу отправлять уведомления о публикациях в реальном времени с помощью событий Laravel 11 Reverb.
Проблема в том, что пользователь, являющийся членом частной группы, может находиться где-то еще на сайте.
В этой ситуации у меня нет прямого доступа к идентификатору этой частной группы.
На этом этапе я защитил широковещательный канал, используя идентификатор группы, и это хороший подход, пока пользователь находится в частной группе. группа, и она не работает, когда пользователь находится в другой частной группе или где-то еще на веб-сайте.
Я попробовал несколько способов трансляции событий для пользователей, которые не активны в группе. Например, я защитил широковещательный канал с помощью идентификатора пользователя, а затем в контроллере прошёл через group->members()->chunk(), но этот подход для группы с большим количеством участников не подходит:
$this->group->members()->chunk(250, function ($users) use ($auth) {
foreach ($users as $user) {
if ($user->pivot->member_id === $user->id) {
broadcast(new GroupEvents(
$this->group,
$user,
$auth,
[
"refresh" => true,
"title" => "The {$this->group->name} group is being archived.",
"message" => "{$auth->full_name} has archived the {$this->group->name} group. All actions within this group are now disabled.",
]
))->toOthers();
}
}
});
Второй метод заключается в том, что я создаю уведомление, используя $user->notify(), а затем в глобальном макете во внешнем интерфейсе я использую Inertia usePoll() для обновления пользователь unread_notifications каждые 3 минуты.
ЕСЛИ пользователь находится в частной группе, он сразу же получит широковещательное уведомление, а если пользователь в этот момент не активен в группе, тогда они будут уведомлены через 3 минуты или в любое другое время, когда они активны на сайте.
Даже для этого метода мне все равно нужно просмотреть участников группы, чтобы подготовить для них уведомления.
[b]Я был бы признателен за любые советы по улучшению этого решения или предложения по лучшему подходу к эффективно обрабатывайте уведомления для больших групп.
Заранее спасибо![/b]
// channel.php
Broadcast::channel('group.events.{id}', function (User $user, $id) {
$group = Group::findOrNew($id);
return $user->address && $group->members()
->wherePivot('member_id', $user->id)
->exists();
});
//GroupEventsJob.php
public array $inputs;
public Group $group;
public User $user;
/**
* Create a new job instance.
*/
public function __construct($group, $user, array $data)
{
$this->inputs = $data;
$this->user = $user;
$this->group = $group;
}
/**
* Execute the job.
*/
public function handle(): void
{
$inputs = new Fluent($this->inputs);
broadcast(new GroupEvents(
$this->group,
$this->user,
[
"refresh" => $inputs->refresh,
"title" => $inputs->title,
"message" => $inputs->message,
]
))->toOthers();
$this->group->members()->chunk(250, function ($users) use ($inputs) {
foreach ($users as $user) {
if ($user->username !== $this->user->username) {
$user->notify(new \App\Notifications\GroupEvents([
"title" => $inputs->title,
"message" => $inputs->message,
"url" => null,
"group_id" => $this->group->uid
]));
if ($user->last_activity === null) {
$user->notifications()
->whereNull('popped_at')
->update(['popped_at' => now()]);
}
}
}
});
}
// GroupController.php
public function archive(string $group)
{
if (!$this->group->is_archived) {
$auth = auth()->user();
$this->group->is_archived = now();
$this->group->join_code = null;
$this->group->save();
dispatch(new GroupEventsJob(
$this->group,
$auth,
[
"refresh" => true,
"title" => "The {$this->group->name} group is being archived.",
"message" => "{$auth->full_name} has archived the {$this->group->name} group. All actions within this group are now disabled.",
]
));
inertia()->clearHistory();
return back()
->with('message', [
"type" => "success",
"content" => "The group has been successfully archived."
]);
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79317007/how-to-push-reverb-event-notifications-out-of-private-group[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия