Laravel Echo никогда не получит событие

По какой-то причине я не могу получить какие-либо данные на моей стороне клиента от эхо-сигнала laravel. Я использую laravel-echo-server (socket.io), redis broadcaster и очереди redis. Насколько я могу судить, они все функциональны. Я расскажу вам, как я настроил его для тестирования. Сначала я создал событие UserCreated:

class UserCreated implements ShouldBroadcast
{
use Dispatchable, InteractsWithSockets, SerializesModels;

public $user;

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

public function broadcastOn()
{
return new Channel('user-created');
}

public function broadcastAs()
{
return 'user.created';
}
}

Затем, чтобы проверить это событие, я создал команду CreateUser:

class CreateUser extends Command
{
protected $signature = 'create:user {username}';

protected $description = 'Create a new user!';

public function __construct()
{
parent::__construct();
}

public function handle()
{
$user = \Chatter\User::create([
'name' => $this->argument('username'),
'email' => uniqid() . '@gmail.com',
'password' => bcrypt('secret')
]);
event(new \Chatter\Events\UserCreated($user));
}
}

Наконец, вот мой laravel-echo-server.json:

{
"authEndpoint": "/broadcasting/auth",
"authHost": "chatter.dev",
"database": "redis",
"databaseConfig": {
"redis": {
"port": "6379",
"host": "localhost"}
},
"port": 6001,
"protocol": "http",
"sslCertPath": "",
"sslKeyPath": "",
"socketio": {}
}

Затем я побежал php artisan queue:listen, а также laravel-echo-server start, Они оба бежали без ошибок.
Чтобы убедиться, что сервер работает, я сделал php artisan create:user Bob123,
Это было успешно. Очередь вернула это (в консоли):

[2017-06-01 01:28:27] Processing: Chatter\Events\UserCreated
[2017-06-01 01:28:27] Processed:  Chatter\Events\UserCreated

И laravel-echo-сервер вернул это (в консоли):

CHANNEL user-created

Итак, чтобы получить данные, которые я отправил пользователю, я создал компонент Vue с прослушивателем эха в смонтированной функции. Вот мой компонент:

<template>
<div class="container">
<div class="row">

</div>
</div>
</template>

<script>
export default {
mounted() {
console.log('Component mounted.');
window.Echo.channel('user-created')
.listen('.user.created', (data) => {
console.log(data);
});
},

data(){
return {
messages: []
}
}
}
</script>

Когда я обновил свою веб-страницу, Component mounted был зарегистрирован в консоли, поэтому я уверен, что он загружен. Но по какой-то причине, когда я отправляю команду CreateUser, данные не регистрируются в консоли браузера.

Вот все, что вы могли бы указать:

Я изменил свой драйвер вещания на Redis в моем .env

BROADCAST_DRIVER=redis
CACHE_DRIVER=redis
SESSION_DRIVER=redis
QUEUE_DRIVER=redis

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379

Я также раскомментировал BroadcastingServiceProvider в конфигурации app.php.

Сейчас я не могу думать ни о чем другом, чтобы вы могли указать на то, что я сделал, но если я запомню другие, я обновлю вопрос.

Спасибо за любую помощь.

Примечание: я не знаком с Redis, поэтому в настоящее время склоняюсь к тому, чтобы быть моей проблемой. Просто добавив predis\predis как зависимость просто не чувствую, что это все, что я должен сделать. Надеюсь, эта заметка поможет.

Редактировать:

Как и предполагалось, я попытался запустить redis-server до того как я запустил laravel-echo-сервер. Вот что было возвращено в консоли:

vagrant@homestead:~/Code/Chatter$ redis-server
16342:C 01 Jun 05:45:38.066 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
16342:M 01 Jun 05:45:38.067 * Increased maximum number of open files to 10032 (it was originally set to 1024).
16342:M 01 Jun 05:45:38.067 # Creating Server TCP listening socket *:6379: bind: Address already in use

Я предполагаю, что это означает, что сервер redis работал, поэтому я думаю, что hometead запускает его автоматически по умолчанию.

Репозиторий Github:

Извините, что так долго, я был очень занят лично. Вот ссылка на репозиторий github для этого проекта. Если есть какие-либо вопросы по поводу хранилища, просто дайте мне знать.

https://github.com/Dastur1970/laravel-echo-test

Изменить 2:

На всякий случай, если это кому-то нужно, вот мой код, который я использовал для создания своего Echo пример.

window.Echo = new Echo({
broadcaster: 'socket.io',
host: window.location.hostname + ':6001'
// auth: {
//     headers: {
//         'Authorization': 'bf242984230eb684 1076b91e572e5bbcc81a852471364c49'
//     }
// },
// key: '1076b91e572e5bbcc81a852471364c497',
// csrfToken: token.content
});

Прокомментировал некоторые вещи, с которыми я тестировал. Не был уверен, понадобится ли мне снова, поэтому я просто оставил их комментированными. Дайте мне знать, если какой-либо из закомментированных кода может быть полезным.

12

Решение

Я установил репозиторий GIT на моем локальном ПК и получил проблему.

Вы используете пользовательское пространство имен, называемое «Chatter», поэтому вы явно определили это в своем коде JS, чтобы Echo мог узнать, как найти этот класс Event.

Так что просто измените «UserCreated» на «.Chatter.Events.UserCreated» в public / js / app.js, и все готово:

mounted: function mounted() {
console.log('Component mounted.');
console.log(window.Echo);
window.Echo.channel('user-created').listen('.Chatter.Events.UserCreated', function (data) {
console.log('tester123');
});
},

Больше информации: https://laravel.com/docs/master/broadcasting#namespaces

2

Другие решения

Хорошо, давайте найдем возможные части, где может быть ваша ошибка:

Это очередь, через которую проходит сервер

  1. Событие
  2. слушатель
  3. Redis
  4. Laravel эхо-сервер
  5. клиент
[2017-06-01 01:28:27] Обработано: Chatter \ Events \ UserCreated

событие было успешно обработано слушателем (шаг 2)

КАНАЛ созданный пользователем

Событие было записано в базу данных, и laravel-echo-server получил его (шаг 4)

Обычно laravel-echo-server печатает сообщение, когда новый пользователь присоединяется к каналу. Я не вижу ни одного из этих сообщений в вашем коде, поэтому связь между laravel-echo-server и клиент может быть проблемой. Кроме того, я не вижу никакого кода, где вы создаете Echo объект на клиенте с Javascript.

2

По вопросам рекламы [email protected]