laravel 5.6

laravel-echo 这个是个大家伙

这东西 文档看不彻底 是没办法操作的

先是

  1. node
  2. redis

再是

  1. 队列
  2. 事件系统
  3. 广播系统

还有

  1. laravel-echo-server
  2. laravel-echo
  3. socket.io-client

然后就 敬请的踩坑吧

他们三者之间的关系
我理解的是 先是触发事件 -> 事件到队列后 -> 在由广播给通知出来

关于 这个家伙

然后 在 laravel 中的 broadcasting (广播系统) 主要是 服务端客户端 推送消息的

然后在 这个 广播系统 中有三种 广播类型

  • Channel
  • Private
  • Presence

这个区别

Channel 公开 所有人不用订阅就可以访问
Private and Presence 这两个 必须在用户登录后才可以订阅

这个区别 后者是好像是 可以监听到 来者的 here joining leaving 这几个事件

对于这个 先是定义一个事件

php artisan make:event 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
// App\Events\Rss;

namespace App\Events;

use Illuminate\Broadcasting\Channel;
use Illuminate\Queue\SerializesModels;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;

/*
implements ShouldBroadcast 这部分是重点
https://laravel.com/docs/5.6/notifications
*/
class Rss implements ShouldBroadcast
{
use Dispatchable, InteractsWithSockets, SerializesModels;

/**
* Create a new event instance.
*
* @return void
*/
public function __construct()
{
//
}

/**
* Get the channels the event should broadcast on.
*
* @return \Illuminate\Broadcasting\Channel|array
*/
public function broadcastOn()
{
/*
这里的 read 是 频道名
Channel PrivateChannel PresenceChannel 这些则是 广播类型
*/
return new Channel('read');
return new PrivateChannel('read');
return new PresenceChannel('read');
}

public function broadcastWith()
{
// 这是 广播内容
return ['name' => \Carbon\Carbon::now()->toDateTimeString()];
}
}

对于 PrivateChannelPresenceChannel 这种类型的
则需要进行授权访问

先去 config\app.php
取消 注释 App\Providers\BroadcastServiceProvider::class,

因为 那是我们授权的路由

   php artisan make:channel Ordel

这条命令主要是防止 路由 文件肿大 是 laravel 5.6 新增功能

再到 routes\channels.php 中注册一个验证授权的路由

1
2
3
4
5
6
7
8
9
10
// 这个 只对私有频道 起作用
// 这里 read 也是频道名
Broadcast::channel('read', Ordel::class);

// 对于 PrivateChannel 频道返回 boolean
Broadcast::channel('read', function () {
return true;
});

// 对于 PresenceChannel 则是 文档吧

然后 具体的 看 https://laravel.com/docs/5.6/notifications

关于 使用 laravel-echo-server

laravel-echo-server init 运行后 按照那提示来

运行后 会在 项目根目录生成一个 laravel-echo-server.json 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
{
"authHost": "网站地址 同 .env APP_URL",
// 授权地址 默认就可以 用于 `PrivateChannel` 和 `PresenceChannel`
"authEndpoint": "/broadcasting/auth",

// laravel-echo-server client:add APP_ID 使用此命令生成 主要用于 api
// https://github.com/tlaverdure/laravel-echo-server#api-clients
"clients": [
{
"appId": "APP_ID",
"key": "79329842613b84ecca054c3a7afa3c63"
}
],
"database": "redis",
"databaseConfig": {
// 关于 redis 的设置 就直接用感觉来 不得行就查文档
"redis": {
"password": "root"
},
"sqlite": {
"databasePath": "/database/laravel-echo-server.sqlite"
}
},
"devMode": false,
"host": null,
"port": "6001",
"protocol": "http",
"socketio": {},
"sslCertPath": "",
"sslKeyPath": "",
"sslCertChainPath": "",
"sslPassphrase": "",
"apiOriginAllow": {
"allowCors": false,
"allowOrigin": "",
"allowMethods": "",
"allowHeaders": ""
}
}

使用 laravel-echo-server start 来运行此服务

关于 使用 laravel-echo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import Echo from 'laravel-echo'

window.io = require('socket.io-client')

window.Echo = new Echo({
broadcaster: 'socket.io',
host: window.location.hostname + ':6001'
});

// 监听频道
// 公开频道
Echo.channel('read')

// 私有频道
Echo.private('read')

// 监听事件
.listen('Rss', (e) => {
console.log(e)
})

// 对于 PresenceChannel 频道 则可以监听到 以下 事件
.here((e) => {

})
.joining((e) => {

})
.leaving((e) => {

})

// 加入频道
.join('频道名')

// 离开频道
.leave('频道名')

关于推送一个广播

1
event(new App\Events\Rss());

最后 别忘记了 运行队列

end

大概就酱 想到再补充