Broadcast:: функция обратного вызова канала не вызывается


Broadcast:: функция обратного вызова канала не вызывается

15.12.2019 09:56:41 Просмотров 85 Источник

У меня есть проблема, когда событие правильно запускается,но данные не возвращаются из функции обратного вызова авторизации внутри Broadcast::channel.

Событие выглядит так:

public function __construct($userId, $message, $username, $profileImg, $fixtureId)
{
    $this->message = $message;
    $this->username = $username;
    $this->profileImg = $profileImg;
    $this->userId = $userId;
    $this->fixtureId = $fixtureId;
}

Канал (присутствие) создается и транслируется следующим образом:

public function broadcastOn()
{
    return new PresenceChannel('fixture-channel.' . $this->fixtureId);
}

Затем в BroadcastServiceProvider

public function boot() { Broadcast::routes(['middleware' => ['auth']]); require base_path('routes/channels.php'); } -файл, в котором находится проблемная функция, выглядит так:

channels.php

Как вы видите, я пытаюсь вставить некоторые данные в функцию обратного вызова, но этого никогда не происходит. Вне функции callaback данные успешно вставляются. Я также попытался с функцией обратного вызова, где определены только Broadcast::channel('fixture-channel.{fixtureId}', function ($user, $fixtureId, $message, $username, $profileImg, $userId) { DB::table('test')->insert(array('id' => '4')); return [ 'message' => $message, 'username' => $username, 'profileImg' => $profileImg, 'userId' => $userId, 'fixtureId' => $fixtureId ]; }); и user-без успеха.

Заранее спасибо.

У вопроса есть решение - Посмотреть?

Ответы - Broadcast:: функция обратного вызова канала не вызывается / Broadcast::channel callback function is not called

senty

15.12.2019 11:24:45

Насколько я знаю, channel.php- это логика авторизации.

Если вы возвращаете данные broadcastWith()- или если у вас нет broadcastWith(), будут переданы общедоступные свойства.

Это должно быть что-то вроде

Broadcast::channel('fixture-channel.{fixtureId}', function ($user, $fixtureId) {
    return $user->canAccess($fixtureId)
});

Остальное прекрасно можно сделать в конструкте. Независимо от того, какие из ваших свойств определены как общедоступные, они будут вытеснены.

public $message;
public $username;
// etc..

public function __construct($userId, $message, $username, $profileImg, $fixtureId)
{
    $this->message = $message;
    $this->username = $username;
    $this->profileImg = $profileImg;
    $this->userId = $userId;
    $this->fixtureId = $fixtureId;
}

Дополнительно, допустим, вы хотите нажать только messageи usernameпользователя, а затем использовать broadcastWith().

public function broadcastWith() {
   return [
     'message' => $this->message,
     'username' => $this->username
   ]
}

Если целью является запись в базу данных, когда сообщение транслируется, вы можете просто поместить его в

public function broadcastOn()
{
    \DB::table('test')->insert(array('id' => '4'));

    return new PresenceChannel('fixture-channel.' . $this->fixtureId);
}
https://stackoverflow.com/questions/59347105/broadcastchannel-callback-function-is-not-called/59347757#comment104892227_59347757
Ну, если вы посмотрите на документацию Laravel Broadcasting, они делают это точно так же, как и я, хотя я согласен, что ваш способ выглядит лучше. Проблема в том, что код аутентификации никогда не вызывается. Я думаю, это потому, что Эхо.метод join не пытается подключиться к каналу - не знаю, почему, хотя.
Помочь в развитии проекта:
Закрыть X