2017-06-01 78 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