聊聊laravel7.0的广播机制,总有你想要的!
时间:2022-03-03 11:48
laravel7.0广播机制(Redis + socket.io) 在广播任意事件之前,首先需要注册 相关栏目教程推荐:《laravel教程》 需要修改 执行上诉命令之后 app 目录下会出现一个 Events 目录,在该目录下产生了广播事件类 增加对 ShouldBroadcast 的实现 修改 broadcastOn 方法,使用公共广播通道 orderStatus 自定义广播的消息名(非必须)【默认情况下,Laravel 会使用事件的类名来广播事件,不过,你可以通过在事件中定义 broadcastAs 方法来自定义广播名称:】 修改构造函数 完整修改如下 可直接替换 因为咱们使用 Redis 广播,需要安装 Predis 库: Redis 广播使用 Redis 的 pub/sub 功能进行广播;不过,你需要将其和能够接受 Redis 消息的 Websocket 服务器进行配对以便将消息广播到 Websocket 频道 当 Redis 广播发布事件时,事件将会被发布到指定的频道上,传递的数据是一个 JSON 格式的字符串,其中包含了事件名称、负载数据 data、以及生成事件 socket ID 的用户 如果使用 pusher 那么直接使只用 laravel 就可以了,如果使用 Redis + socket.io 则需要使用开源项目 laravel-echo-server 。所以我们现在要使用 全局安装 在浏览器上执行 由于前端使用的是 在 js 代码的意思是收听 news 通道内的 News 事件对象,将接收到的事件在控制台打印出来。 相关推荐:最新的五个Laravel视频教程 以上就是聊聊laravel7.0的广播机制,总有你想要的!的详细内容,更多请关注www.gxlsystem.com其它相关文章!广播服务提供者
App\Providers\BroadcastServiceProvider
。在新安装的 Laravel 应用中,你只需要取消 config/app.php
配置文件中 providers
数组内对应服务提供者之前的注释即可。该提供者允许你注册广播授权路由和回调设置 Redis 连接
.env
文件中的广播驱动为 redis
:BROADCAST_DRIVER=redis
建立 Event
php artisan make:event OrderShipped
OrderShipped.php
。我们要对自动生成的 OrderShipped 类进行以下修改<?php
namespace 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
composer require predis/predis
安装 laravel-echo-server 订阅 Redis Sub
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)N
Configuration 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 R
version 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_orderStatus
Event: anyName
安装 laravel-echo 的前依赖
laravel-echo
来收听广播,我们选择的底层实现方式是socket.io
。所以首先我们要在package.json
中添加 laravel-echo
和 socket.io
的依赖npm i --save socket.io-client
npm 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>
基本构建
npm install && npm run watch