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

2022-05-15 0 494

laravel7.0广播机制(Redis + socket.io)

广播服务提供者

在广播任意事件之前,首先需要注册App\\Providers\\BroadcastServiceProvider。在新安装的 Laravel 应用中,你只需要取消 config/app.php 配置文件中 providers 数组内对应服务提供者之前的注释即可。该提供者允许你注册广播授权路由和回调

相关栏目教程推荐:《laravel教程

设置 Redis 连接

需要修改 .env 文件中的广播驱动为 redis

BROADCAST_DRIVER=redis

建立 Event

php 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-server

laravel-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-server

laravel-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-echosocket.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视频教程

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

【声明:根据2013年1月30日《计算机软件保护条例》2次修订第17条规定: 为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存 储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬! 鉴于此,也希望大家按此说明研究软件!】
本站所有源码尽量保证原汁原味,如有特殊情况会作出声明及标注,网站资源不做任何二次加密(原版加密除外,不影响程序使用的不会做解密处理),方便您更好的学习参考。 在您的能力范围内,为了大环境的良性发展,请尽可能的选择正版资源。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

即刻码站__国内靠谱的站长资源下载平台 php教程 聊聊laravel7.0的广播机制,总有你想要的! https://www.jike1995.com/36891.html

常见问题
  • 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用
查看详情
  • 最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度
查看详情

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务