Laravel Echo 从未收到事件
Laravel Echo never recieving event
出于某种原因,我的客户端无法从 laravel echo 接收到任何数据。我正在使用 laravel-echo-server (socket.io)、redis 广播器和 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-server 返回了这个(在控制台中):
CHANNEL user-created
所以,为了获取我与用户发送的数据,我创建了一个 Vue 组件,在挂载函数中有一个 echo 监听器。这是我的组件:
<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 命令时,数据未登录到浏览器控制台。
以下是您可能要指出的所有内容:
我在 .env
中将广播驱动程序更改为 redis
BROADCAST_DRIVER=redis
CACHE_DRIVER=redis
SESSION_DRIVER=redis
QUEUE_DRIVER=redis
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
我还取消了 app.php 配置中 BroadcastingServiceProvider 的注释。
我现在想不出任何您可能会指出我已经做过的事情,但如果我记得任何其他事情,我会更新这个问题。
感谢您的帮助。
注意:我不熟悉 Redis,所以目前我倾向于这是我的问题。简单地添加 predis\predis
作为依赖项并不觉得这就是我要做的全部。希望这篇笔记能有所帮助。
编辑:
按照建议,我在 运行 laravel-echo-server 之前尝试了 运行 redis-server
。这是控制台返回的内容:
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 服务器是 运行,所以我猜 homestead 默认会自动启动它。
Github 存储库:
抱歉拖了这么久,我个人很忙。这是此项目的 link 到 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
});
注释掉了我正在测试的一些内容。不确定我是否需要再次使用,所以我只是让他们发表评论。让我知道任何注释代码是否真的有用。
好的,让我们找出您可能出错的部分:
这是服务器运行到
的队列
- 事件
- 听众
- Redis
- Laravel-回声服务器
- 客户
[2017-06-01 01:28:27] Processed: Chatter\Events\UserCreated
侦听器已成功处理事件(第 2 步)
CHANNEL user-created
事件已写入数据库,laravel-echo-server 得到它(第 4 步)
通常 laravel-echo-server
会在新用户加入频道时打印一条消息。我在您的代码中看到 none 条消息,因此 laravel-echo-server
和客户端之间的连接可能是问题所在。此外,我没有看到您在客户端上使用 Javascript.
创建 Echo
对象的任何代码
我已经在我的本地 PC 上设置了您的 GIT 存储库并遇到了问题。
您正在使用名为 "Chatter" 的自定义命名空间,因此您已在 JS 代码中明确定义了它,以便 Echo 可以知道如何找到该事件 class。
所以只需将 "UserCreated" 更改为 public/js/app.js 中的“.Chatter.Events.UserCreated”,就可以了:
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
出于某种原因,我的客户端无法从 laravel echo 接收到任何数据。我正在使用 laravel-echo-server (socket.io)、redis 广播器和 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-server 返回了这个(在控制台中):
CHANNEL user-created
所以,为了获取我与用户发送的数据,我创建了一个 Vue 组件,在挂载函数中有一个 echo 监听器。这是我的组件:
<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 命令时,数据未登录到浏览器控制台。
以下是您可能要指出的所有内容:
我在 .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
我还取消了 app.php 配置中 BroadcastingServiceProvider 的注释。
我现在想不出任何您可能会指出我已经做过的事情,但如果我记得任何其他事情,我会更新这个问题。
感谢您的帮助。
注意:我不熟悉 Redis,所以目前我倾向于这是我的问题。简单地添加 predis\predis
作为依赖项并不觉得这就是我要做的全部。希望这篇笔记能有所帮助。
编辑:
按照建议,我在 运行 laravel-echo-server 之前尝试了 运行 redis-server
。这是控制台返回的内容:
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 服务器是 运行,所以我猜 homestead 默认会自动启动它。
Github 存储库:
抱歉拖了这么久,我个人很忙。这是此项目的 link 到 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
});
注释掉了我正在测试的一些内容。不确定我是否需要再次使用,所以我只是让他们发表评论。让我知道任何注释代码是否真的有用。
好的,让我们找出您可能出错的部分:
这是服务器运行到
的队列- 事件
- 听众
- Redis
- Laravel-回声服务器
- 客户
[2017-06-01 01:28:27] Processed: Chatter\Events\UserCreated
侦听器已成功处理事件(第 2 步)
CHANNEL user-created
事件已写入数据库,laravel-echo-server 得到它(第 4 步)
通常 laravel-echo-server
会在新用户加入频道时打印一条消息。我在您的代码中看到 none 条消息,因此 laravel-echo-server
和客户端之间的连接可能是问题所在。此外,我没有看到您在客户端上使用 Javascript.
Echo
对象的任何代码
我已经在我的本地 PC 上设置了您的 GIT 存储库并遇到了问题。
您正在使用名为 "Chatter" 的自定义命名空间,因此您已在 JS 代码中明确定义了它,以便 Echo 可以知道如何找到该事件 class。
所以只需将 "UserCreated" 更改为 public/js/app.js 中的“.Chatter.Events.UserCreated”,就可以了:
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