Laravel学习教程之广播模块详解
《Laravel学习教程之广播模块详解》要点: 前言PHP实战 本文主要给大家介绍了关于Laravel广播模块的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍:PHP实战 注意:本文是基于Laravel 5.4版本的路由模块代码进行分析书写;PHP实战 简介 广播是指发送方发送一条消息,订阅频道的各个接收方都能及时收到消息;比如 A同学写了一篇文章,这时候 B同学在文章底下评论了,A同学在页面上是不用刷新就能收到提示有文章被评论了,这个本质上就是A同学收到了广播消息,这个广播消息是由B同学评论这个动作触发了发送广播消息;PHP实战 在整个广播行为中,有一个重要的概念叫频道channel,频道的类型有PHP实战
移动端订阅了公共频道public,会直接提示成功;私有频道private和存在频道presence在进行订阅的过程中,会向服务器端发送权限验证,看是不是有权限可以订阅该频道;私有频道private和存在频道presence的区别在于,私有频道private能够接收其他成员发送的消息,而存在频道presence除此之外,还能够在用户的加入与离开时接收信息;PHP实战 广播适合以下场景:PHP实战
模块组成PHP实战 PHP实战 Demo 日志驱动 配置 .env文件修改或添加一行: 广播 直接调用PHP实战 $manager = app(IlluminateBroadcastingBroadcastManager::class); $driver = $manager->connection(); // 第一个参数是频道名,第二个参数是事件名,第三个参数是广播内容 $driver->broadcast(['channel_1','channel_2'],'login',['message' => 'hello world']); 因为是日志驱动,所以广播内容会写到框架配置的日志文件中,输出消息如下所示PHP实战 [2017-08-18 20:45:49] local.INFO: Broadcasting [login] on channels [channel_1,channel_2] with payload: { "message": "hello world" } 监听事件广播 这种调用方式,是当实现ShouldBroadcast接口的事件被触发时,则会进行广播操作;(同时,还有一个接口叫ShouldBroadcastNow,与ShouldBroadcast接口的不同在于,将实现ShouldBroadcastNow接口的事件放入队列中时,会被放入叫sync的队列中)PHP实战 举个例子,PHP实战 第一步,IlluminateAuthEventsLogin事件是用户登录成功后会触发的事件,略作改动,让其实现广播功能;PHP实战 class Login implements ShouldBroadcast { ...... // 定义事件被触发时,广播频道;此处定义名为 first-channel 的私有频道 public function broadcastOn() { return [ new PrivateChannel('first-channel'),]; } // 自定义广播名称;如果方法未定义,默认以类名为事件名,此处的默认值是 IlluminateAuthEventsLogin public function broadcastAs() { return 'login'; } } 第二步,注册事件监听;在app/Providers/EventServiceProvider.php中修改:PHP实战 protected $listen = [ ...... 'IlluminateAuthEventsLogin' => [ 'AppListenersUserLogin',],]; 文件app/Listeners/UserLogin.php粗糙地实现了一下:PHP实战 class UserLogin { public function __construct() {} public function handle(Login $event){ Log::info('Do UserLogin Listener: I was Login'); } } 第三步,触发事件,发送广播;有好几种触发广播方式:PHP实战 直接事件触发 event(new IlluminateAuthEventsLogin($user,true)); 帮助函数broadcast,间接触发事件 broadcast(new IlluminateAuthEventsLogin($user,true)); 广播管理类,间接触发事件,直接广播 $manager = app(IlluminateBroadcastingBroadcastManager::class); $manager->event(new IlluminateAuthEventsLogin($user,放入队列 |