ホームページ  >  記事  >  PHPフレームワーク  >  laravel7.0のブロードキャストメカニズムについて話しましょう。欲しいものは必ずあります!

laravel7.0のブロードキャストメカニズムについて話しましょう。欲しいものは必ずあります!

藏色散人
藏色散人転載
2021-07-28 15:57:541818ブラウズ

laravel7.0 ブロードキャスト メカニズム (Redisソケット.io)

ブロードキャスト サービス プロバイダー

イベントをブロードキャストする前に、まずApp\を登録する必要があります。プロバイダー\ブロードキャストサービスプロバイダー。新しくインストールした Laravel アプリケーションでは、config/app.php 構成ファイルの providers 配列内の対応するサービス プロバイダーのコメントを解除するだけで済みます。このプロバイダーを使用すると、ブロードキャスト認証ルートとコールバックを登録できます。

関連コラム チュートリアルの推奨事項: 「laravel チュートリアル

Redis 接続のセットアップ

.env ファイル内のブロードキャスト ドライバーを redis に変更する必要があります:

BROADCAST_DRIVER=redis

Create Event

php artisan make:event OrderShipped
#アピール コマンドを実行すると、アプリ ディレクトリにイベント ディレクトリが表示され、ブロードキャスト イベント クラス

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 形式の文字列で、イベント名、ロード データ データ、イベント ソケット ID を生成したユーザーが含まれます

laravel-echo-server をインストールし、Redis Sub をサブスクライブします

プッシャーを使用する場合は、直接 laravel を使用します。

Redis ソケット.io

を使用する場合は、次のものが必要ですオープンソースプロジェクト laravel-echo-server を使用します。そこで、laravel-echo-serverグローバルインストール

npm install -g laravel-echo-server
を使用します。laravel-echoを初期化します。サーバー

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
を使用してブロードキャストをリッスンするため、選択した基盤となる実装は

ソケット.io

です。したがって、最初に

laravel-echosocket.io の依存関係

npm i --save socket.io-client
npm i --save laravel-echo
package.json に追加する必要があります

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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事は任志帆的博客で複製されています。侵害がある場合は、admin@php.cn までご連絡ください。