По какой-то причине я не могу получить какие-либо данные на моей стороне клиента от эхо-сигнала 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
});
Прокомментировал некоторые вещи, с которыми я тестировал. Не был уверен, понадобится ли мне снова, поэтому я просто оставил их комментированными. Дайте мне знать, если какой-либо из закомментированных кода может быть полезным.
Я установил репозиторий 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
Хорошо, давайте найдем возможные части, где может быть ваша ошибка:
Это очередь, через которую проходит сервер
[2017-06-01 01:28:27] Обработано: Chatter \ Events \ UserCreated
событие было успешно обработано слушателем (шаг 2)
КАНАЛ созданный пользователем
Событие было записано в базу данных, и laravel-echo-server получил его (шаг 4)
Обычно laravel-echo-server
печатает сообщение, когда новый пользователь присоединяется к каналу. Я не вижу ни одного из этих сообщений в вашем коде, поэтому связь между laravel-echo-server
и клиент может быть проблемой. Кроме того, я не вижу никакого кода, где вы создаете Echo
объект на клиенте с Javascript.