laravel7.0-Broadcast-Mechanismus (Redis + socket.io)
Bevor Sie ein Ereignis übertragen, müssen Sie zunächst AppProvidersBroadcastServiceProvider
registrieren . In einer neu installierten Laravel-Anwendung müssen Sie lediglich die Konfigurationsdatei config/app
deaktivieren. Die Anmerkungen vor den entsprechenden Dienstanbieterncode> array genügen. Mit diesem Anbieter können Sie Broadcast-Autorisierungsrouten und Rückrufe registrierenAppProvidersBroadcastServiceProvider
。在新安装的 Laravel 应用中,你只需要取消 config/app.php
配置文件中 providers
数组内对应服务提供者之前的注释即可。该提供者允许你注册广播授权路由和回调
相关栏目教程推荐:《laravel教程》
需要修改 .env
文件中的广播驱动为 redis
:
BROADCAST_DRIVER=redis
php artisan make:event OrderShipped
执行上诉命令之后 app 目录下会出现一个 Events 目录,在该目录下产生了广播事件类 OrderShipped.php
。我们要对自动生成的 OrderShipped 类进行以下修改
增加对 ShouldBroadcast 的实现
修改 broadcastOn 方法,使用公共广播通道 orderStatus
自定义广播的消息名(非必须)【默认情况下,Laravel 会使用事件的类名来广播事件,不过,你可以通过在事件中定义 broadcastAs 方法来自定义广播名称:】
修改构造函数
完整修改如下 可直接替换
<?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'); } }
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 广播,需要安装 Predis 库:
composer require predis/predis
Redis 广播使用 Redis 的 pub/sub 功能进行广播;不过,你需要将其和能够接受 Redis 消息的 Websocket 服务器进行配对以便将消息广播到 Websocket 频道
当 Redis 广播发布事件时,事件将会被发布到指定的频道上,传递的数据是一个 JSON 格式的字符串,其中包含了事件名称、负载数据 data、以及生成事件 socket ID 的用户
如果使用 pusher 那么直接使只用 laravel 就可以了,如果使用 Redis + socket.io 则需要使用开源项目 laravel-echo-server 。所以我们现在要使用 laravel-echo-server
全局安装
npm install -g 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 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
来收听广播,我们选择的底层实现方式是socket.io
。所以首先我们要在package.json
中添加 laravel-echo
和 socket.io
.env
ändern redis
: npm i --save socket.io-client npm i --save laravel-echo
import Echo from "laravel-echo"; window.io = require("socket.io-client"); window.Echo = new Echo({ broadcaster: "socket.io", host: window.location.hostname + ":6001" });
OrderShipped.php
wird in diesem Verzeichnis generiert. Wir müssen die folgenden Änderungen an der automatisch generierten OrderShipped-Klasse vornehmen🎜🎜Die vollständige Änderung ist wie folgt und kann direkt ersetzt werden🎜
<!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
🎜Redis Broadcast verwendet die Redis Pub/Sub-Funktion zum Senden; Sie müssen es jedoch mit einem Websocket-Server koppeln, der Redis-Nachrichten akzeptieren kann, um Nachrichten an den Websocket-Kanal zu senden🎜< /blockquote>🎜Wenn Redis ein Ereignis sendet, wird das Ereignis auf dem angegebenen Kanal veröffentlicht. Die übergebenen Daten sind eine JSON-Formatzeichenfolge, die den Ereignisnamen, Nutzdaten und den Benutzer enthält, der die Ereignis-Socket-ID generiert hat 🎜Installieren Sie laravel -echo-server. Abonnieren Sie Redis Sub🎜🎜Wenn Sie Pusher verwenden, verwenden Sie einfach Laravel. Wenn Sie 🎜Redis + socket.io🎜 verwenden, müssen Sie einen verwenden Open-Source-Projekt laravel-echo-server . Daher werden wir jetzt
laravel-echo-server
🎜🎜globale Installation🎜🎜🎜rrreee🎜🎜verwenden, um Laravel zu initialisieren -echo- server🎜
🎜rrreee🎜🎜Laravel-echo-server starten🎜🎜🎜rrreee🎜🎜
rrreee
- Das wird es Ausgabe nach erfolgreichem Start Das folgende Protokoll
Testübertragung 🎜🎜Ausgeführt im Browser
http://yourhost /api/ship ?id=16
🎜🎜🎜rrreee🎜🎜
- Laravel-Echo-Server-Verbindung erfolgreich!
Installieren Sie die Abhängigkeiten von laravel-echo 🎜🎜Da das Frontend
laravel-echo</code verwendet > Um Radio zu hören, haben wir als zugrunde liegende Implementierung <code class="sprache-plaintext highlighter-rouge">socket.io
ausgewählt. Also müssen wir zuerstlaravel-echo
undzu <code class="lingual-plaintext highlighter-rouge">package.json</code hinzufügen > class="sprache-plaintext highlighter-rouge">socket.io
s Abhängigkeiten🎜🎜🎜rrreee🎜🎜🎜Bearbeiten Sie „resource/js/bootstrap.js“ und fügen Sie den folgenden Code hinzu🎜🎜🎜rrreee🎜🎜测试页面
在
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>Nach dem Login kopierenNach dem Login kopierenjs 代码的意思是收听 news 通道内的 News 事件对象,将接收到的事件在控制台打印出来。
基本构建
npm install && npm run watchNach dem Login kopierenNach dem Login kopieren相关推荐:最新的五个Laravel视频教程
Das obige ist der detaillierte Inhalt vonLassen Sie uns über den Broadcast-Mechanismus von Laravel7.0 sprechen. Es gibt immer das, was Sie wollen!. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!