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组件,并在mounted函数中添加了一个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 仓库:
抱歉让你久等了,我个人非常忙碌。这是该项目的 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-server
,当它启动并运行时再启动laravel-echo-server
。 - Nehal Hasnayeenphp artisan queue:work --sleep=1
命令,以及查看你的 laravel-echo-server 运行在哪个端口? - Nehal Hasnayeen