首頁  >  文章  >  php框架  >  聊聊laravel7.0的廣播機制,總有你想要的!

聊聊laravel7.0的廣播機制,總有你想要的!

藏色散人
藏色散人轉載
2021-07-28 15:57:541817瀏覽

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 方法來自訂廣播名稱:】

  • 修改建構子

##完整修改如下可直接取代

<?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 &#39;anyName&#39;;
    }
    /**
     * Get the channels the event should broadcast on.
     *
     * @return \Illuminate\Broadcasting\Channel|array
     */
    public function broadcastOn()
    {
        return new Channel(&#39;orderStatus&#39;);
    }
}
設定api 路由

Route::get(&#39;/ship&#39;, function (Request $request) {
    $id = $request->input(&#39;id&#39;);
    broadcast(new OrderShipped($id)); // 触发事件
    return &#39;Order Shipped!&#39;;
});

安裝前端鷹架

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)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-server 連線成功!
安裝laravel-echo 的前依賴

由於前端使用的是

laravel-echo來收聽廣播,我們選擇的底層實作方式是 socket.io。所以首先我們要在package.json中加入laravel-echosocket.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>

js 代码的意思是收听 news 通道内的 News 事件对象,将接收到的事件在控制台打印出来。

基本构建

npm install && npm run watch

相关推荐:最新的五个Laravel视频教程

以上是聊聊laravel7.0的廣播機制,總有你想要的!的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:任志帆的博客。如有侵權,請聯絡admin@php.cn刪除