您好,欢迎访问一九零五行业门户网

聊聊laravel7.0的广播机制,总有你想要的!

laravel7.0广播机制(redis + socket.io)
广播服务提供者在广播任意事件之前,首先需要注册app\providers\broadcastserviceprovider。在新安装的 laravel 应用中,你只需要取消 config/app.php 配置文件中 providers 数组内对应服务提供者之前的注释即可。该提供者允许你注册广播授权路由和回调
相关栏目教程推荐:《laravel教程》
设置 redis 连接需要修改 .env 文件中的广播驱动为 redis:
broadcast_driver=redis
建立 eventphp artisan make:event ordershipped
执行上诉命令之后 app 目录下会出现一个 events 目录,在该目录下产生了广播事件类 ordershipped.php。我们要对自动生成的 ordershipped 类进行以下修改
增加对 shouldbroadcast 的实现
修改 broadcaston 方法,使用公共广播通道 orderstatus
自定义广播的消息名(非必须)【默认情况下,laravel 会使用事件的类名来广播事件,不过,你可以通过在事件中定义 broadcastas 方法来自定义广播名称:】
修改构造函数
完整修改如下 可直接替换
<?phpnamespace app\events;use illuminate\broadcasting\channel;use illuminate\broadcasting\interactswithsockets;use illuminate\broadcasting\presencechannel;use illuminate\broadcasting\privatechannel;use illuminate\contracts\broadcasting\shouldbroadcast;use illuminate\foundation\events\dispatchable;use illuminate\queue\serializesmodels;class ordershipped implements shouldbroadcast{ use dispatchable, interactswithsockets, serializesmodels; //可添加任意成员变量 public $id; //事件构造函数 public function __construct($id) { $this->id = $id; } //自定义广播的消息名 public function broadcastas() { return 'anyname'; } /** * get the channels the event should broadcast on. * * @return \illuminate\broadcasting\channel|array */ public function broadcaston() { return new channel('orderstatus'); }}
设置 api 路由route::get('/ship', function (request $request) { $id = $request->input('id'); broadcast(new ordershipped($id)); // 触发事件 return 'order shipped!';});
安装前端脚手架composer require laravel/uiphp artisan ui vue --auth
redis因为咱们使用 redis 广播,需要安装 predis 库:
composer require predis/predis
redis 广播使用 redis 的 pub/sub 功能进行广播;不过,你需要将其和能够接受 redis 消息的 websocket 服务器进行配对以便将消息广播到 websocket 频道
当 redis 广播发布事件时,事件将会被发布到指定的频道上,传递的数据是一个 json 格式的字符串,其中包含了事件名称、负载数据 data、以及生成事件 socket id 的用户
安装 laravel-echo-server 订阅 redis sub如果使用 pusher 那么直接使只用 laravel 就可以了,如果使用 redis + socket.io 则需要使用开源项目 laravel-echo-server 。所以我们现在要使用 laravel-echo-server
全局安装
npm install -g laravel-echo-server
初始化 laravel-echo-serverlaravel-echo-server init// 是否在开发模式下运行此服务器(y/n) 输入y? do you want to run this server in development mode? (y/n)// 设置服务器的端口 默认 6001 输入 6001就可以了 或者你想要的? which port would you like to serve from? (6001)// 想用的数据库 选择 redis? which database would you like to use to store presence channel members? (use arrow keys)❯ redis sqlite// 这里输入 你的laravel 项目的访问域名? enter the host of your laravel authentication server. (http://localhost)// 选择 网络协议 http? will you be serving on http or https? (use arrow keys)❯ http https// 您想为http api生成客户端id/密钥吗 n? do you want to generate a client id/key for http api? (y/n)// 要设置对api的跨域访问吗?(y/n)nconfiguration file saved. run laravel-echo-server start to run server.//您希望将此配置另存为什么? (laravel-echo-server.json)回车就行? what do you want this config to be saved as? (laravel-echo-server.json)
启动 laravel-echo-serverlaravel-echo-server start
成功启动后会输出以下日志l a r a v e l e c h o s e r v e rversion 1.6.0⚠ starting server in dev mode...✔ running at localhost on port 6001✔ channels are ready.✔ listening for http events...✔ listening for redis events...server ready!
测试广播在浏览器上执行 http://yourhost/api/ship?id=16
channel: laravel_database_orderstatusevent: anyname
laravel-echo-server 连接成功!安装 laravel-echo 的前依赖由于前端使用的是 laravel-echo来收听广播,我们选择的底层实现方式是socket.io。所以首先我们要在package.json中添加 laravel-echo 和 socket.io的依赖
npm i --save socket.io-clientnpm i --save laravel-echo
编辑 resource/js/bootstrap.js 添加如下代码import echo from "laravel-echo";window.io = require("socket.io-client");window.echo = new echo({ broadcaster: "socket.io", host: window.location.hostname + ":6001"});
测试页面在 resources/views/ 下建立页面 test.blade.php 内容为
<!doctype html><html><head> <meta charset="utf-8"> <meta http-equiv="x-ua-compatible" content="ie=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="csrf-token" content=""> <title>news room</title> <link href="" rel="stylesheet"></head><body> <div class="content"> news room </div> <script src=""></script> <script> echo.channel("laravel_database_orderstatus") // 广播频道名称 .listen(".anyname", e => { // 消息名称 console.log(e); // 收到消息进行的操作,参数 e 为所携带的数据 }); </script></body></html>
js 代码的意思是收听 news 通道内的 news 事件对象,将接收到的事件在控制台打印出来。
基本构建npm install && npm run watch
相关推荐:最新的五个laravel视频教程
以上就是聊聊laravel7.0的广播机制,总有你想要的!的详细内容。
其它类似信息

推荐信息