Laravel: Pusher слушает приватный канал с уникальным идентификатором - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть новостная лента, если пользователь X прокомментировал сообщение пользователя Y, тогда пользователь Y должен получить уведомление. Теперь проблема в том, что у пользователя Y нет идентификатора поста, по которому пользователь X прокомментировал:

// Create comment 
$comment = new Comment;
$comment->post_id = $post_id;
$comment->user_id = $user_id;
$comment->body = $body;
$comment->save();

// Save activity in database
$newUser = PostActivity::firstOrCreate([
    'post_id'   => $post_id,
],[
    'user_id' => Auth::user()->id,
    'post_id' => $post_id,
    'seen'    => '0'
]);

// Dispatch event with newly created comment

FeedCommentActivity::dispatch($comment);

Событие:

public function broadcastOn()
{
    return new PrivateChannel('post-comment-activity.' .$this->activity->post_id);
}

Канал:

Broadcast::channel('post-comment-activity.{postId}', function ($user, $postId) {
    // Lets say true for the time
    return true;
});

И слушатель, вот тут возникает мой вопрос, как тут может подойти postId:

Отгде postId придет, чтобы прослушать и соответствовать канал, который слушает.

window.Echo.channel('post-comment-activity' + postId)
        .listen('FeedCommentActivity', e => {
    console.log('New comment by a user');
    console.log(e);
});

Я хочу уведомить участника или владельца сообщения, чтобы получать уведомления при появлении нового комментарияподходит.

Что будет обходным путем?Есть альтернативный способ?

1 Ответ

0 голосов
/ 27 ноября 2018

Вам необходимо получить все Post идентификаторы текущего пользователя.Затем подпишитесь на каждый связанный частный канал независимо.

Это не очень масштабируемо в вашем случае.

Возможно, вам лучше иметь один частный канал на пользователя:

// routes/channels.php
Broadcast::channel('users.{user}', function ($currentUser, User $user) {
    return $currentUser->id === $user->id;
});

Затем вещайте:

// app/Events/CommentCreated.php
class CommentCreated implements ShouldBroadcast
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    public $comment;

    public function __construct(Comment $comment)
    {
        $this->comment = $comment;
    }

    public function broadcastOn()
    {
        return new PrivateChannel('users.' .$this->comment->post->user_id);
    }
    // ...

// app/Observers/CommentObserver.php
class CommentObserver
{
    public function created(Comment $comment)
    {
        broadcast(new CommentCreated($comment))->toOthers();
    }
    //...

Затем слушайте:

window.Echo.channel('users.' + userId).listen('CommentCreated', e => {
    console.log(e.comment);
});
...