2017-06-01 111 views
12

无论出于何种原因,我无法从客户端收到来自laravel回声的任何数据。我正在使用laravel-echo-server(socket.io),redis broadcaster和redis队列。据我所知,它们都是功能性的。我会带你了解我如何设置测试。首先,我创建了一个UserCreated事件:Laravel回声从未收到事件

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回波-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:listenlaravel-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回波服务器返回此(控制台):

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命令时,数据不会记录到浏览器控制台中。

这里是你可能会指出一切:

我改变了我的广播司机在我.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的。

现在我想不出任何其他的东西,你可能会指出我已经完成了,但如果我记得其他人,我会更新这个问题。

感谢您的任何帮助。

注:我不熟悉Redis,所以目前我倾向于这是我的问题。简单地将predis\predis作为依赖关系根本就不会像我所要做的那样。希望这个说明有所帮助。

编辑:

至于建议,我试图运行redis-server之前我跑laravel回声服务器。这是在控制台返回:

[email protected]:~/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的服务器运行,所以我想宅在默认情况下自动启动。

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 
}); 

评论了一些我正在测试的东西。不知道我是否会再次需要,所以我只是留下他们评论。让我知道是否有任何评论的代码可能实际上有帮助。

+0

你的Redis服务器前应laravel回声服务器 –

+0

@NehalHasnayeen能否请您阐述一下我怎么可能做到这一点开始? – Dastur

+0

你先运行'redis-server',当它启动并运行时,然后启动'laravel-echo-server' –

回答

2

我已经在我的本地PC上设置了您的GIT repo,并解决了问题。

您正在使用名为“Chatter”的自定义名称空间,因此您已在您的JS代码中明确定义了该名称,以便Echo知道如何找到该Event类。

因此,只需在public/js/app中将“UserCreated”更改为“.Chatter.Events.UserCreated”即可。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 -echo-Server
  5. 客户端

[2017年6月1日1点28分27秒]耗时:颤振\活动\ UserCreated

的活动已成功由听者处理(步骤2)

CHANNEL用户创建的

的事件写入到数据库和laravel回波服务器得到它(步骤4)

正常情况下,当新用户加入频道时,laravel-echo-server将显示一条消息。我在代码中看不到任何这些消息,因此laravel-echo-server与客户端之间的连接可能成为问题。此外,我没有看到任何代码,您在客户端用Javascript创建了Echo对象。

+0

你的权利很奇怪,它没有显示用户加入频道,而是用'.user.created'作为前缀的时候,你用事件中的'broadcastAs'方法重命名你的事件。 – Dastur

+0

之前从未使用'boradcastas',但在查看官方文档后,我找到了前导点。你可以在你初始连接服务器的地方发布你的'新E​​cho'代码吗? – mimo

+0

我用我的代码在上面编辑了Echo实例。 – Dastur