Sistem penyiaran
- Tentukan acara siaran Baris gilir siaran
- Saluran kebenaran
- Tentukan panggilan balik kebenaran
- Tentukan kelas saluran
- Siaran acara
- Hanya disiarkan kepada orang lain
- Terima siaran Keluar saluran
- Saluran Kehadiran
- Pengenalan Dalam aplikasi web moden, WebSockets digunakan untuk melaksanakan antara muka pengguna masa nyata dan dikemas kini serta-merta. Apabila data pada pelayan dikemas kini, maklumat kemas kini dihantar kepada klien melalui sambungan WebSocket untuk diproses. Ini adalah pilihan yang lebih dipercayai dan cekap daripada mengundi aplikasi secara berterusan.
- Untuk membantu anda membina aplikasi jenis ini, Laravel akan memudahkan untuk "menyiarkan" acara melalui sambungan WebSocket. Menyiarkan acara Laravel membolehkan anda berkongsi nama acara yang sama antara aplikasi JavaScript sisi pelayan dan sisi klien. {Nota} Sebelum mengetahui lebih lanjut tentang penyiaran acara, sila pastikan anda telah membaca semua dokumentasi tentang acara dan pendengar Laravel.
Konfigurasi
Semua konfigurasi tentang penyiaran acara disimpan dalam fail konfigurasi
config/broadcasting.php
. Laravel disertakan dengan beberapa pemacu siaran: Penolak, Redis dan pemaculog
untuk pembangunan tempatan dan penyahpepijatan. Selain itu, terdapat pemacunull
yang membolehkan anda mematikan sistem penyiaran sepenuhnya. Contoh konfigurasi untuk setiap pemacu boleh didapati dalam fail konfigurasiconfig/broadcasting.php
.config/broadcasting.php
配置文件中。 Laravel 自带了几个广播驱动: Pusher 、 Redis , 和一个用于本地开发与调试的log
驱动。另外,还有一个null
驱动允许你完全关闭广播系统。每一个驱动的示例配置都可以在config/broadcasting.php
配置文件中找到。广播服务提供者
在对事件进行广播之前,你必须先注册
AppProvidersBroadcastServiceProvider
。对于一个新建的 Laravel 应用程序,你只需要在config/app.php
配置文件的providers
数组中取消对该提供者的注释即可。该提供者将允许你注册广播授权路由和回调。CSRF 令牌
Laravel Echo 需要访问当前会话的 CSRF 令牌。你应当验证你的应用程序的
head
HTML 元素是否定义了包含 CSRF 令牌的meta
标签:<meta name="csrf-token" content="{{ csrf_token() }}">
对驱动的要求
Pusher
如果你使用 Pusher 来对事件进行广播,请用 Composer 包管理器来安装 Pusher PHP SDK :
composer require pusher/pusher-php-server "~3.0"
然后,你需要在
config/broadcasting.php
配置文件中配置你的 Pusher 证书。该文件中已经包含了一个 Pusher 示例配置,你可以快速地指定你的 Pusher key 、secret 和 application ID。config/broadcasting.php
文件的pusher
配置项同时也允许你指定 Pusher 支持的额外options
,例如 cluster:'options' => [ 'cluster' => 'eu', 'encrypted' => true ],
当 Pusher 和 Laravel Echo 一起使用时,你应该在
resources/assets/js/bootstrap.js
文件中实例化 Echo 对象时指定pusher
作为所需要的 broadcaster :import Echo from "laravel-echo"window.Pusher = require('pusher-js'); window.Echo = new Echo({ broadcaster: 'pusher', key: 'your-pusher-key' });
Redis
如果你使用 Redis 广播器,请安装 Predis 库:
composer require predis/predis
Redis 广播器会使用 Redis 的 发布 / 订阅 特性来广播消息;尽管如此,你仍需将它与能够从 Redis 接收消息的 WebSocket 服务器配对使用以便将消息广播到你的 WebSocket 频道上去。
当 Redis 广播器发布一个事件的时候,该事件会被发布到它指定的频道上去,传输的数据是一个采用 JSON 编码的字符串。该字符串包含了事件名、
data
Pembekal Perkhidmatan Siaran
Sebelum menyiarkan acara, anda mesti mendaftarAppProvidersBroadcastServiceProvider
dahulu. Untuk aplikasi Laravel baharu, anda hanya perlu menyahkomen pembekal dalam tatasusunanpembekal
fail konfigurasiconfig/app.php
. Pembekal ini akan membenarkan anda mendaftar laluan kebenaran siaran dan panggilan balik.🎜Token CSRF
🎜Laravel Echo memerlukan akses kepada semasa Token CSRF sesi. Anda harus mengesahkan bahawa elemen HTMLhead
aplikasi anda mentakrifkan tegmeta
yang mengandungi token CSRF: 🎜npm install --save socket.io-client
🎜< /a> 🎜🎜🎜Keperluan untuk pemandu🎜🎜Penolak
🎜Jika anda menggunakan Pusher untuk menyiarkan acara, sila gunakan pengurus pakej Composer untuk memasang Pusher PHP SDK: 🎜import Echo from "laravel-echo"window.io = require('socket.io-client'); window.Echo = new Echo({ broadcaster: 'socket.io', host: window.location.hostname + ':6001' });
🎜Kemudian, anda perlu < Konfigurasikan sijil Pusher anda dalam fail konfigurasi code>config/broadcasting.php. Fail ini sudah mengandungi konfigurasi contoh Pusher supaya anda boleh menentukan kunci, rahsia dan ID aplikasi Pusher anda dengan cepat. Item konfigurasipusher
dalam failconfig/broadcasting.php
juga membenarkan anda untuk menentukanoptions
tambahan yang disokong oleh Pusher, seperti kelompok: 🎜event(new ShippingStatusUpdated($update));
🎜Apabila Pusher Apabila digunakan dengan Laravel Echo, anda harus membuat instantiate objek Echo dalamresources/assets/js/bootstrap.js
fail Tentukanpenolak
sebagai penyiar yang diperlukan: 🎜<?php namespace App\Events; use Illuminate\Broadcasting\Channel; use Illuminate\Queue\SerializesModels; use Illuminate\Broadcasting\PrivateChannel; use Illuminate\Broadcasting\PresenceChannel; use Illuminate\Broadcasting\InteractsWithSockets; use Illuminate\Contracts\Broadcasting\ShouldBroadcast; class ShippingStatusUpdated implements ShouldBroadcast{ /** * 有关配送状态更新的信息。 * * @var string */ public $update; }
🎜Redis
🎜Jika anda menggunakan penyiar Redis, sila Pasang pustaka Predis: 🎜/** * 获取事件应该广播的频道。 * * @return array */ public function broadcastOn(){ return new PrivateChannel('order.'.$this->update->order_id); }
🎜Penyiar Redis menggunakan ciri terbitkan/langganan Redis untuk menyiarkan mesej namun, anda masih perlu memasangkannya dengan pelayan WebSocket yang mampu menerima mesej daripada Redis untuk menyiarkan mesej ke saluran WebSocket anda; Naik. 🎜🎜Apabila penyiar Redis menerbitkan acara, acara itu akan diterbitkan ke saluran yang ditetapkan dan data yang dihantar ialah rentetan berkod JSON. Rentetan ini mengandungi nama acara, datadata
dan pengguna yang menjana ID soket acara (jika tersedia). 🎜🎜🎜Socket.IO
Jika anda ingin memasangkan penyiar Redis dengan pelayan Socket.IO, anda perlu memperkenalkan perpustakaan klien JavaScript Socket.IO ke dalam aplikasi anda. Anda boleh memasangnya melalui pengurus pakej NPM:
Broadcast::channel('order.{orderId}', function ($user, $orderId) { return $user->id === Order::findOrNew($orderId)->user_id; });
Kemudian, anda perlu menentukan penyambung
socket.io
danhost
apabila menghidupkan Echo.socket.io
连接器和host
。Echo.private(`order.${orderId}`) .listen('ShippingStatusUpdated', (e) => { console.log(e.update); });
最后,你需要运行一个与 Laravel 兼容的 Socket.IO 服务器。 Laravel 官方并没有内置 Socket.IO 服务器实现;不过,可以选择一个由社区驱动维护的项目 tlaverdure/laravel-echo-server ,目前托管在 GitHub 。
对队列的要求
在开始广播事件之前,你还需要配置和运行 队列监听器 。所有的事件广播都是通过队列任务来完成的,因此应用程序的响应时间不会受到明显影响。
概念综述
Laravel 的事件广播允许你使用基于驱动的 WebSockets 将服务端的 Laravel 事件广播到客户端的 JavaScript 应用程序。当前的 Laravel 自带了 Pusher 和 Redis 驱动。通过使用 Laravel Echo 的 Javascript 包,我们可以很方便地在客户端消费事件。
事件通过「频道」来广播,这些频道可以被指定为公开或私有的。任何访客都可以不经授权或认证订阅一个公开频道;然而,如果想要订阅一个私有频道,那么该用户必须通过认证,并获得该频道的授权。
使用示例程序
在深入了解事件广播的每个组件之前,让我们先用一个电子商务网站作为例子来概览一下。我们不会讨论配置 Pusher 或者 Laravel Echo 的细节,这些会在本文档的其它章节里详细讨论。
在我们的应用程序中,我们假设有一个允许用户查看订单配送状态的页面。有一个
ShippingStatusUpdated
<?php namespace App\Events; use Illuminate\Broadcasting\Channel; use Illuminate\Queue\SerializesModels; use Illuminate\Broadcasting\PrivateChannel; use Illuminate\Broadcasting\PresenceChannel; use Illuminate\Broadcasting\InteractsWithSockets; use Illuminate\Contracts\Broadcasting\ShouldBroadcast; class ServerCreated implements ShouldBroadcast{ use SerializesModels; public $user; /** * 创建一个新的事件实例。 * * @return void */ public function __construct(User $user) { $this->user = $user; } /** *获得事件广播的频道。 * * @return Channel|array */ public function broadcastOn() { return new PrivateChannel('user.'.$this->user->id); } }
Akhir sekali, anda perlu menjalankan pelayan Socket.IO yang serasi dengan Laravel. Laravel tidak secara rasmi mempunyai pelaksanaan pelayan Socket.IO terbina dalam walau bagaimanapun, anda boleh memilih projek yang dipacu komuniti dan diselenggarakan tlaverdure; /laravel-echo- server, pada masa ini dihoskan di GitHub.🎜Keperluan untuk baris gilir🎜🎜Sebelum anda mula menyiarkan acara, anda juga perlu mengkonfigurasi dan menjalankan pendengar baris gilir. Semua penyiaran acara dilakukan melalui tugas baris gilir, jadi masa respons aplikasi tidak akan terjejas dengan ketara. 🎜🎜🎜🎜Concept Overview
🎜Siaran acara Laravel membolehkan anda menggunakan WebSockets berasaskan pemacu menyiarkan acara Laravel sebelah pelayan kepada aplikasi JavaScript sebelah pelanggan. Laravel semasa disertakan dengan Pusher dan pemacu Redis. Dengan menggunakan pakej Javascript Laravel Echo, kami boleh menggunakan acara dengan mudah di sisi pelanggan. 🎜🎜Acara disiarkan melalui "saluran", yang boleh ditetapkan sebagai awam atau peribadi. Mana-mana pelawat boleh melanggan saluran awam tanpa kebenaran atau pengesahan bagaimanapun, jika ingin melanggan saluran peribadi, pengguna mesti disahkan dan dibenarkan untuk saluran tersebut. 🎜🎜🎜🎜Menggunakan contoh aplikasi
🎜Ketahui lebih lanjut tentang acara Sebelum pergi ke setiap komponen siaran, mari kita berikan gambaran keseluruhan menggunakan tapak web e-dagang sebagai contoh. Kami tidak akan membincangkan butiran mengkonfigurasi Penolak atau Laravel Echo, mereka akan dibincangkan dalam Ini dibincangkan secara terperinci di tempat lain dalam dokumen ini. 🎜🎜Dalam aplikasi kami, kami menganggap terdapat halaman yang membolehkan pengguna melihat status penghantaran pesanan. Terdapat acaraShippingStatusUpdated
yang akan dicetuskan apabila status penghantaran dikemas kini: 🎜/** * 事件的广播名称。 * * @return string */ public function broadcastAs(){ return 'server.created'; }
🎜🎜ShouldBroadcast Antara Muka ShouldBroadcast
接口当用户在查看自己的订单时,我们不希望他们必须通过刷新页面才能看到状态更新。我们希望一旦有更新时就主动将更新信息广播到客户端。所以,我们必须标记
ShippingStatusUpdated
事件实现ShouldBroadcast
接口。这会让 Laravel 在事件被触发时广播该事件:.listen('.server.created', function (e) { .... });
ShouldBroadcast
接口要求事件定义一个broadcastOn
方法。该方法负责指定事件被广播到哪些频道。在(通过 Artisan 命令)生成的事件类中,一个空的broadcastOn
方法已经被预定义好了,所以我们只需要完成其细节即可。我们希望只有订单的创建者能够看到状态的更新,所以我们要把该事件广播到与这个订单绑定的私有频道上去:{ "user": { "id": 1, "name": "Patrick Stewart" ... } }
授权频道
记住,用户只有在被授权之后才能监听私有频道。我们可以在
routes/channels.php
文件中定义频道的授权规则。在本例中,我们需要对视图监听私有order.1
频道的所有用户进行验证,确保只有订单真正的创建者才能监听:/** * 指定广播数据。 * * @return array */ public function broadcastWith(){ return ['id' => $this->user->id]; }
channel
方法接收两个参数:频道名称和一个回调函数,该回调通过返回true
或者false
来表示用户是否被授权监听该频道。所有的授权回调接收当前被认证的用户作为第一个参数,任何额外的通配符参数作为后续参数。在本例中,我们使用
{orderId}
占位符来表示频道名称的 「ID」 部分是通配符。对事件广播进行监听
接下来,就只剩下在 JavaScript 应用程序中监听事件了。我们可以通过 Laravel Echo 来实现。首先,我们使用
private
方法来订阅私有频道。然后,使用listen
方法来监听ShippingStatusUpdated
Apabila pengguna melihat pesanan mereka, kami tidak mahu mereka perlu memuat semula halaman untuk melihat kemas kini status. Kami berharap dapat menyiarkan maklumat kemas kini secara proaktif kepada pelanggan sebaik sahaja terdapat kemas kini. Jadi, kita mesti menandakan acaraShippingStatusUpdated
untuk melaksanakan antara mukaShouldBroadcast
. Ini akan menyebabkan Laravel menyiarkan acara apabila ia dicetuskan:/** * 事件被推送到的队列名称。 * * @var string */ public $broadcastQueue = 'your-queue-name';
Antara muka
ShouldBroadcast
memerlukan acara untuk menentukan kaedahbroadcastOn
. Kaedah ini bertanggungjawab untuk menentukan saluran mana acara itu disiarkan. Dalam kelas acara yang dijana (melalui arahan Artisan), kaedahbroadcastOn
kosong sudah dipratakrifkan, jadi kami hanya perlu melengkapkan butirannya. Kami berharap hanya pencipta pesanan boleh melihat kemas kini status, jadi kami perlu menyiarkan acara ke saluran peribadi yang terikat dengan pesanan ini:<?php use Illuminate\Contracts\Broadcasting\ShouldBroadcastNow; class ShippingStatusUpdated implements ShouldBroadcastNow{ // }
Saluran DibenarkanIngat, pengguna hanya boleh memantau saluran peribadi jika mereka dibenarkan. Kami boleh menentukan peraturan kebenaran saluran dalam failroutes/channels.php
. Dalam kes ini, kami perlu mengesahkan semua pengguna yang pandangannya mendengar saluranorder.1
peribadi untuk memastikan bahawa hanya pencipta sebenar pesanan itu boleh mendengar:/** * 判定事件是否可以广播。 * * @return bool */ public function broadcastWhen(){ return $this->value > 100; }
🎜saluran kaedah Menerima dua parameter: nama saluran dan fungsi panggil balik, yang menunjukkan sama ada pengguna dibenarkan untuk mendengar saluran dengan mengembalikan true
ataufalse
. 🎜🎜Semua panggilan balik kebenaran menerima pengguna yang disahkan pada masa ini sebagai parameter pertama dan sebarang parameter kad bebas tambahan sebagai parameter seterusnya. Dalam contoh ini, kami menggunakan pemegang tempat{orderId}
untuk menunjukkan bahawa bahagian "ID" pada nama saluran ialah kad bebas. 🎜🎜🎜Mendengar siaran acara🎜Seterusnya, yang tinggal hanyalah mendengar acara dalam aplikasi JavaScript. Kita boleh melakukan ini dengan Laravel Echo. Pertama, kami menggunakan kaedahpribadi
untuk melanggan saluran peribadi. Kemudian, gunakan kaedahdengar
untuk mendengar acaraShippingStatusUpdated
. Secara lalai, semua harta awam acara akan disertakan dalam acara siaran: 🎜Broadcast::routes();
🎜🎜🎜🎜🎜🎜Tentukan acara siaran
Untuk memberitahu Laravel bahawa acara tertentu perlu disiarkan, cuma laksanakan antara muka
IlluminateContractsBroadcastingShouldBroadcast
dalam kelas acara. Antara muka ini telah diimport ke dalam semua kelas acara yang dijana oleh rangka kerja, jadi anda boleh menambahkannya dengan mudah pada acara anda sendiri.IlluminateContractsBroadcastingShouldBroadcast
接口即可。该接口已被导入到所有由框架生成的事件类中,所以你可以很方便地将它添加到你自己的事件中。ShouldBroadcast
接口要求你实现一个方法:broadcastOn
。 该方法返回一个频道或者一个频道数组,事件会被广播到这些频道。这些频道必须是Channel
、PrivateChannel
或者PresenceChannel
的实例。Channel
代表任何用户都可以订阅的公开频道, 而PrivateChannels
和PresenceChannels
则代表需要 频道授权 的私有频道:Broadcast::routes($attributes);
然后,你只需要像你平时那样 触发事件 。一旦事件被触发,一个 队列任务 会自动广播事件到你指定的广播驱动上。
广播名称
Laravel 默认会使用事件的类名作为广播名称来广播事件。不过,你也可以在事件类中定义一个
broadcastAs
方法来自定义广播名称:window.Echo = new Echo({ broadcaster: 'pusher', key: 'your-pusher-key', authEndpoint: '/custom/endpoint/auth' });
如果你使用了
broadcastAs
方法来自定义广播名称,你应当确保在你注册监听器时加上一个.
的前缀。这将指示 Echo 不要在事件之前添加应用程序的命名空间:Broadcast::channel('order.{orderId}', function ($user, $orderId) { return $user->id === Order::findOrNew($orderId)->user_id; });
广播数据
当一个事件被广播时,其所有的
public
属性都会自动序列化并作为事件有效载荷进行广播,这允许你在 JavaScript 应用程序中访问到事件所有的公有数据。举个例子,如果你的事件有一个单独的包含了一个 Eloquent 模型的公有$user
属性,那么事件的广播有效载荷将会是:use App\Order; Broadcast::channel('order.{order}', function ($user, Order $order) { return $user->id === $order->user_id; });
不过,如果你想更细粒度地控制你的广播有效载荷,你可以向你的事件中添加一个
Antara mukabroadcastWith
ShouldBroadcast
memerlukan anda melaksanakan kaedah:broadcastOn
. Kaedah ini mengembalikan saluran atau tatasusunan saluran yang mana acara itu akan disiarkan. Saluran ini mestilah contohSaluran
,PrivateChannel
atauPresenceChannel
.Saluran
mewakili saluran awam yang mana-mana pengguna boleh melanggan, manakalaPrivateChannels
danPresenceChannels
mewakili saluran yang memerlukan Kebenaran SaluranSaluran Peribadi:
Broadcast::channel('channel', function() { // ... }, ['guards' => ['web', 'admin']])
Kemudian, anda hanya perlu mencetuskan acara seperti biasa. Setelah acara dicetuskan, tugas baris gilir akan menyiarkan acara secara automatik kepada pemacu siaran yang anda tentukan.Nama siaran
🎜Laravel akan menggunakan nama kelas acara oleh lalai Sebagai nama siaran untuk menyiarkan acara. Walau bagaimanapun, anda juga boleh mentakrifkan kaedahbroadcastAs
dalam kelas acara untuk menyesuaikan nama siaran: 🎜php artisan make:channel OrderChannel
🎜 Jika anda menggunakan kaedahbroadcastAs
untuk menyesuaikan nama siaran, anda harus pastikan bahawa Apabila anda mendaftarkan pendengar, tambahkan awalan.
. Ini akan mengarahkan Echo untuk tidak menambah acara dengan ruang nama apl: 🎜use App\Broadcasting\OrderChannel; Broadcast::channel('order.{order}', OrderChannel::class);
🎜🎜🎜🎜broadcast Data
🎜Apabila acara disiarkan, semua sifatawam
nya disiri dan disiarkan secara automatik sebagai muatan acara Ini membolehkan anda mengakses semua sifat acara dalam aplikasi JavaScript anda data. Contohnya, jika acara anda mempunyai satu harta$user
awam tunggal yang mengandungi model Eloquent, maka muatan siaran acara itu ialah: 🎜<?php namespace App\Broadcasting; use App\User;use App\Order; class OrderChannel{ /** * 创建一个新的频道实例。 * * @return void */ public function __construct() { // } /** * 认证用户的频道访问权限。 * * @param \App\User $user * @param \App\Order $order * @return array|bool */ public function join(User $user, Order $order) { return $user->id === $order->user_id; } }
🎜Walau bagaimanapun, jika anda mahu menjadi lebih terperinci Untuk kawalan terperinci ke atas muatan siaran anda, anda boleh menambah kaedahbroadcastWith
pada acara anda. Kaedah ini mengembalikan tatasusunan data yang ingin anda siarkan sebagai muatan acara: 🎜event(new ShippingStatusUpdated($update));
🎜🎜🎜🎜🎜🎜Baris Gilir Siaran
Secara lalai, setiap acara siaran akan ditolak ke baris gilir lalai yang sepadan dengan sambungan baris gilir lalai yang dinyatakan dalam fail konfigurasi
queue.php
. Anda boleh menentukan sifatbroadcastQueue
dalam kelas acara untuk menyesuaikan baris gilir yang digunakan oleh penyiar. Harta ini memerlukan anda untuk menentukan nama baris gilir yang anda mahu gunakan semasa penyiaran:queue.php
配置文件中指定的默认队列连接相应的默认队列中。你可以在事件类中定义一个broadcastQueue
属性来自定义广播器所使用的队列。该属性需要你指定广播时你想要用的队列名称:broadcast(new ShippingStatusUpdated($update));
如果你想使用
sync
队列而不是默认队列驱动来广播事件,你可以实现ShouldBroadcastNow
接口而不是ShouldBroadcast
:broadcast(new ShippingStatusUpdated($update))->toOthers();
广播条件
有时,你想在给定条件为 true 的情况下才广播你的事件。你可以通过在事件类中添加一个
broadcastWhen
方法来定义这些条件:axios.post('/task', task) .then((response) => { this.tasks.push(respo });
授权频道
对于私有频道,用户只有被授权之后才能监听。实现过程是用户向你的 Laravel 应用程序发起一个携带频道名称的 HTTP 请求,由你的应用程序判断该用户是否能够监听该频道。在使用 Laravel Echo 时,授权订阅私有频道的 HTTP 请求会自动发送;尽管如此,你仍需定义相应的路由来响应这些请求。
定义授权路由
幸运的是,在 Laravel 中我们可以很容易地定义路由来响应频道授权请求。在 Laravel 自带的
BroadcastServiceProvider
中,你可以看到对Broadcast::routes
方法的调用。该方法会注册/broadcasting/auth
路由来处理授权请求:var socketId = Echo.socketId();
Broadcast::routes
方法会自动将它的路由置入web
中间件组中;不过,如果你想自定义指定的属性,你可以向该方法传递一个路由属性数组:npm install --save laravel-echo pusher-js
自定义授权端点
默认情况下,Echo 将使用
/broadcasting/auth
端点来授权频道访问。 但是,您可以通过将authEndpoint
import Echo from "laravel-echo" window.Echo = new Echo({ broadcaster: 'pusher', key: 'your-pusher-key' });
Jika anda ingin menggunakan baris gilirsync
dan bukannya pemacu baris gilir lalai untuk menyiarkan acara, anda boleh melaksanakanShouldBroadcastNow
Antara muka dan bukannyaShouldBroadcast
:window.Echo = new Echo({ broadcaster: 'pusher', key: 'your-pusher-key', cluster: 'eu', encrypted: true });
broadcast syarat🎜🎜kadang-kadang , anda mahu menyiarkan acara anda hanya jika syarat yang diberikan adalah benar. Anda boleh menentukan syarat ini dengan menambahkan kaedahbroadcastWhen
pada kelas acara: 🎜const client = require('pusher-js'); window.Echo = new Echo({ broadcaster: 'pusher', key: 'your-pusher-key', client: client });
🎜🎜🎜🎜Saluran Dibenarkan
🎜Untuk saluran peribadi, pengguna hanya boleh memantaunya jika mereka dibenarkan. Proses pelaksanaan ialah pengguna memulakan permintaan HTTP yang membawa nama saluran ke aplikasi Laravel anda dan aplikasi anda menentukan sama ada pengguna boleh mendengar saluran tersebut. Apabila menggunakan Laravel Echo🎜, permintaan HTTP untuk membenarkan langganan saluran peribadi dihantar secara automatik walau bagaimanapun, anda masih perlu menentukan laluan yang sesuai untuk membalas permintaan ini. 🎜🎜🎜🎜🎜🎜Tentukan laluan kebenaran🎜🎜Nasib baik, dalam Laravel kita boleh Menentukan laluan untuk bertindak balas dengan mudah permintaan kebenaran saluran. DalamBroadcastServiceProvider
yang disertakan dengan Laravel, anda boleh melihat panggilan ke kaedahBroadcast::routes
. Kaedah ini akan mendaftarkan laluan/broadcasting/auth
untuk mengendalikan permintaan kebenaran: 🎜Echo.channel('orders') .listen('OrderShipped', (e) => { console.log(e.order.name); });
🎜 KaedahBroadcast::routes
akan meletakkan laluannya secara automatik ke dalamweb kod kod> dalam kumpulan perisian tengah; walau bagaimanapun, jika anda ingin menyesuaikan atribut yang ditentukan, anda boleh menghantar tatasusunan atribut penghalaan kepada kaedah ini: 🎜
Echo.private('orders') .listen(...) .listen(...) .listen(...);
🎜< h4> Titik Tamat Keizinan Tersuai🎜Secara lalai, Echo akan menggunakan titik akhir/broadcasting/auth
untuk membenarkan akses saluran. Walau bagaimanapun, anda boleh menentukan titik akhir kebenaran anda sendiri dengan menghantar pilihan konfigurasiauthEndpoint
kepada contoh Echo: 🎜Echo.leaveChannel('orders');
🎜🎜🎜🎜🎜🎜Tentukan panggil balik kebenaran
Seterusnya, kita perlu menentukan logik yang sebenarnya mengendalikan kebenaran saluran. Logik ini dilengkapkan dalam fail
routes/channels.php
yang disertakan dengan aplikasi. Dalam fail ini, anda boleh menggunakan kaedahBroadcast::channel
untuk mendaftarkan panggilan balik kebenaran saluran:routes/channels.php
文件中完成。在这个文件中,你可以使用Broadcast::channel
方法来注册频道授权回调:Echo.leave('orders');
channel
方法接收两个参数:频道名称和一个回调函数,该回调通过返回true
或者false
来表示用户是否被授权监听该频道。所有的授权回调接收当前认证用户作为第一个参数,任何额外的通配符参数作为后续参数。在本例中,我们使用
{orderId}
占位符来表示频道名称的 「ID」 部分是通配符。授权回调模型绑定
就像 HTTP 路由一样,频道路由也可以利用显式或隐式 路由模型绑定 。例如,你可以请求接收一个真正的
Order
模型实例,而不是字符串或数字类型的 order ID:window.Echo = new Echo({ broadcaster: 'pusher', key: 'your-pusher-key', namespace: 'App.Other.Namespace' });
授权回调验证
私有频道和在线广播频道通过应用程序的默认授权验证对当前用户身份进行验证。 如果用户未经过授权验证,则会自动拒绝通道授权,并且永远不会执行授权回调。 但是,您可以分配多个自定义防护,以便在必要时对传入请求进行身份验证:
Echo.channel('orders') .listen('.Namespace.Event.Class', (e) => { // });
定义频道类
如果你的应用程序用到了许多不同的频道,你的
routes/channels.php
文件可能会变得很庞大。所以,你可以使用频道类来代替使用闭包授权频道。要生成一个频道类,请使用make:channel
Artisan 命令。该命令会在App/Broadcasting
目录中放置一个新的频道类。Broadcast::channel('chat.{roomId}', function ($user, $roomId) { if ($user->canJoinRoom($roomId)) { return ['id' => $user->id, 'name' => $user->name]; } });
接下来,在你的
routes/channels.php
文件中注册你的频道:Echo.join(`chat.${roomId}`) .here((users) => { // }) .joining((user) => { console.log(user.name); }) .leaving((user) => { console.log(user.name); });
最后,你可以将频道的授权逻辑放入频道类的
join
方法中。该join
/** * 获得事件广播的频道。 * * @return Channel|array */ public function broadcastOn(){ return new PresenceChannel('room.'.$this->message->room_id); }
Kaedahchannel
menerima dua parameter: nama saluran dan panggilan balik fungsi, Panggilan balik ini menunjukkan sama ada pengguna dibenarkan untuk mendengar saluran dengan mengembalikantrue
ataufalse
.Semua panggilan balik kebenaran menerima pengguna yang disahkan semasa sebagai parameter pertama, dan sebarang parameter kad bebas tambahan sebagai parameter seterusnya. Dalam contoh ini, kami menggunakan pemegang tempat
{orderId}
untuk menunjukkan bahawa bahagian "ID" pada nama saluran ialah kad bebas.Pengikatan model panggil balik kebenaran
Sama seperti penghalaan HTTP, penghalaan saluran juga boleh mengambil kesempatan daripada pengikatan model penghalaan yang jelas atau tersirat . Contohnya, anda boleh meminta untuk menerima contoh model
Pesanan
sebenar dan bukannya rentetan atau ID pesanan berangka:broadcast(new NewMessage($message)); broadcast(new NewMessage($message))->toOthers();
< h4> Pengesahan panggilan balik kebenaranSaluran peribadi dan saluran siaran dalam talian mengesahkan identiti pengguna semasa melalui pengesahan kebenaran lalai aplikasi. Jika pengguna tidak disahkan untuk kebenaran, kebenaran saluran ditolak secara automatik dan panggilan balik kebenaran tidak pernah dilaksanakan. Walau bagaimanapun, anda boleh menetapkan berbilang pengawal tersuai untuk mengesahkan permintaan masuk apabila perlu: 🎜🎜Echo.join(`chat.${roomId}`) .here(...) .joining(...) .leaving(...) .listen('NewMessage', (e) => { // });
🎜 🎜Tentukan kelas saluran🎜🎜Jika aplikasi anda menggunakan banyak saluran yang berbeza, failroutes/channels.php
anda mungkin menjadi sangat besar. Jadi, anda boleh menggunakan kelas saluran dan bukannya menggunakan penutupan untuk membenarkan saluran. Untuk menjana kelas saluran, gunakan perintahmake:channel
Artisan. Perintah ini meletakkan kelas saluran baharu dalam direktoriApp/Broadcasting
. 🎜Echo.private('chat') .whisper('typing', { name: this.user.name });
🎜Seterusnya, daftarkan saluran anda dalam failroutes/channels.php
anda: 🎜Echo.private('chat') .listenForWhisper('typing', (e) => { console.log(e.name); });
🎜Akhir sekali, anda boleh meletakkan logik kebenaran saluran ke dalamjoin< kelas saluran /code> kaedah. Kaedah
sertai
akan memegang logik yang sama yang biasanya anda masukkan dalam penutupan kebenaran saluran. Sudah tentu, anda juga boleh memanfaatkan pengikatan model saluran: 🎜Echo.private(`App.User.${userId}`) .notification((notification) => { console.log(notification.type); });
🎜🎜{Nota} Seperti kebanyakan kelas lain dalam Laravel, kelas saluran diselesaikan secara automatik melalui bekas perkhidmatan. Oleh itu, anda boleh menaip petunjuk kebergantungan yang diperlukan pada kelas saluran anda dalam pembinanya. 🎜🎜🎜🎜🎜🎜🎜🎜Acara siaran
Selepas mentakrifkan acara dan menandakannya untuk melaksanakan antara muka
rrreeeShouldBroadcast
, anda hanya perlu mencetuskan acara melalui fungsievent
. Penghantar acara akan mengenali acara yang ditandakan dengan antara mukaShouldBroadcast
dan menolaknya ke baris gilir untuk siaran:ShouldBroadcast
接口之后,你所要做的仅仅是通过event
函数来触发该事件。事件分发器会识别出标记了实现ShouldBroadcast
接口的事件,并将其推送到队列中进行广播:只广播给他人
当创建一个会用到事件广播的应用程序时,你可以使用
rrreeebroadcast
函数来代替event
。和event
函数一样,broadcast
函数将事件分发到服务端监听器:不过,
rrreeebroadcast
函数还有一个允许你将当前用户排除在广播接收者之外的toOthers
方法:为了更好地理解什么时候使用
rrreeetoOthers
方法,让我们假设有一个任务列表的应用程序,用户可以通过输入任务名来新建任务。要新建任务,你的应用程序需要发起一个请求到一个/task
路由,该路由会广播任务的创建,并返回新任务的 JSON 响应。当你的 JavaScript 应用程序从路由收到响应后,它会直接将新任务插入到任务列表中,就像这样:然而,别忘了,我们还广播了任务的创建。如果你的 JavaScript 应用程序正在监听该事件以便添加任务至任务列表,任务列表中将出现重复的任务:一个来自路由响应,另一个来自广播。你可以通过使用
toOthers
方法告知广播器不要将事件广播到当前用户来解决这个问题。{注} 为了能调用
toOthers
方法,你的事件必须使用IlluminateBroadcastingInteractsWithSockets
trait 。配置
当你初始化 Laravel Echo 实例的时候,一个套接字 ID 会被分配到该连接。如果你使用了 Vue 和 Axios ,该套接字 ID 会自动地以
X-Socket-ID
头的方式添加到每一个传出请求中。那么,当你调用toOthers
方法时,Laravel 会从请求头中取出套接字 ID ,并告知广播器不要广播任何消息到带有这个套接字 ID 的连接上。你如果你没有使用 Vue 和 Axios ,则需要手动配置 JavaScript 应用程序来发送
X-Socket-ID
请求头。你可以用Echo.socketId
rrreeeHanya disiarkan kepada orang lain
Apabila membuat aplikasi yang menggunakan penyiaran acara, anda boleh menggunakan fungsibroadcast
untuk menggantikanevent< /kod>. Seperti fungsi
yang mengecualikan pengguna semasa daripada menjadi penerima siaran:event
, fungsibroadcast
mengedarkan acara kepada pendengar sebelah pelayan:rrreeeWalau bagaimanapun, fungsibroadcast
juga mempunyai fungsi tambahan yang membolehkan anda menggunakan kaedahkepadaLain rrreee
Untuk lebih memahami bila hendak menggunakan kaedahkepadaLain, mari kita anggap kita mempunyai tugas senarai Program aplikasi, pengguna boleh mencipta tugasan baharu dengan memasukkan nama tugasan. Untuk membuat tugasan baharu, aplikasi anda membuat permintaan ke laluan /task
, yang menyiarkan penciptaan tugasan dan mengembalikan respons JSON untuk tugasan baharu itu. Apabila aplikasi JavaScript anda menerima respons daripada laluan, ia akan memasukkan tugasan baharu terus ke dalam senarai tugasan, seperti ini:{Nota} Untuk memanggil kaedah
toOthers
, acara anda mesti menggunakan ciriIlluminateBroadcastingInteractsWithSockets
.Konfigurasi
🎜Apabila anda memulakan tika Laravel Echo, ID soket akan diberikan kepada sambungan . Jika anda menggunakan Vue🎜 dan Axios🎜, ID soket ini akan Ditambah secara automatik pada setiap keluar permintaan sebagai pengepalaX-Socket-ID
. Kemudian, apabila anda memanggil kaedahtoOthers
, Laravel akan mengeluarkan ID soket daripada pengepala permintaan dan memberitahu penyiar untuk tidak menyiarkan sebarang mesej kepada sambungan dengan ID soket ini. 🎜🎜Jika anda tidak menggunakan Vue dan Axios, anda perlu mengkonfigurasi aplikasi JavaScript anda secara manual untuk menghantar pengepala permintaanX-Socket-ID
. Anda boleh menggunakan kaedahEcho.socketId
untuk mendapatkan ID soket: 🎜rrreee🎜🎜🎜🎜🎜🎜🎜Terima siaran🎜🎜🎜🎜🎜🎜🎜Pasang Laravel Echo
Laravel Echo ialah perpustakaan JavaScript dengan pustaka ini, ia menjadi sangat mudah untuk melanggan saluran dan mendengar acara yang disiarkan oleh Laravel. Anda boleh memasang Echo melalui pengurus pakej NPM. Dalam kes ini, memandangkan kami akan menggunakan penyiar Pusher, kami juga akan memasang pakej
rrreeepusher-js
:pusher-js
包:安装好 Echo 之后,你就可以在应用程序的 JavaScript 中创建一个全新的 Echo 实例。做这件事的一个理想的地方是在 Laravel 框架自带的
rrreeeresources/js/bootstrap.js
文件的底部:当你使用
rrreeepusher
连接器来创建一个 Echo 实例的时候,还可以指定cluster
以及连接是否需要加密:使用现有客户端实例
如果您已经有一个希望 Echo 使用的 Pusher 或 Socket.io 客户端实例,您可以通过
rrreeeclient
配置选项将其传递给 Echo:对事件进行监听
安装并实例化 Echo 之后, 你就可以开始监听事件广播了。首先,使用
rrreeechannel
方法获取一个频道实例,然后调用listen
方法来监听指定的事件:如果你想监听私有频道上的事件,请使用
rrreeeprivate
方法。你可以通过链式调用listen
方法来监听单个频道上的多个事件:退出频道
要离开频道,您可以在 Echo 实例上调用
rrreeeleaveChannel
方法:如果您想离开私有频道和在线频道,您可以调用
rrreeeleave
方法:命名空间
你可能已经注意到在上面的例子中,我们并没有为事件类指定完整的命名空间。这是因为 Echo 会默认事件都在
rrreeeAppEvents
命名空间下。不过,你可以在实例化 Echo 时传递一个namespace
配置项来指定根命名空间:另外,你可以在使用 Echo 订阅事件的时候为事件类加上
Selepas memasang Echo, anda boleh mencipta yang baharu dalam tika JavaScript Echo aplikasi anda. Tempat yang sesuai untuk melakukan ini ialah di bahagian bawah fail.
rrreeeresources/js/bootstrap.js
yang disertakan dengan rangka kerja Laravel:Gunakan instance Klien pelanggan sedia ada
Jika anda sudah mempunyai instance klien Pusher atau Socket.io yang anda mahu Echo gunakan, anda boleh menghantarnya kepada Echo melalui pilihan konfigurasirrreeeclient
:Dengar untuk acaraSelepas memasang dan menghidupkan Echo, anda boleh mula mendengar siaran acara. Mula-mula, gunakan kaedah
rrreeesaluran
untuk mendapatkan contoh saluran, dan kemudian panggil kaedahdengar
untuk mendengar acara yang ditentukan:Jika anda ingin mendengar acara pada saluran peribadi, sila gunakan kaedah < code>pribadi. Anda boleh mendengar berbilang acara pada satu saluran dengan merantai kaedahrrreee🎜🎜🎜listen
:🎜🎜Keluar saluran🎜🎜Untuk meninggalkan saluran, anda boleh menghubungi kaedahleaveChannel
pada contoh Echo: 🎜rrreee🎜Jika anda ingin meninggalkan saluran peribadi dan saluran dalam talian, anda boleh panggil kaedahtinggal
: 🎜rrreee🎜🎜🎜🎜🎜namespaces🎜🎜Anda mungkin perasan bahawa Dalam contoh di atas, kami tidak menyatakan ruang nama lengkap untuk kelas acara. Ini kerana Echo akan acara lalai berada di bawah ruang namaAppEvents
. Walau bagaimanapun, anda boleh menghantar item konfigurasiruang nama untuk menentukan ruang nama akar apabila membuat instantiated Echo: 🎜rrreee🎜 Selain itu, anda boleh menambah pada kelas acara apabila menggunakan Echo untuk melanggan acara < /code> awalan. Ini membolehkan anda menentukan nama kelas yang layak sepenuhnya: 🎜rrreee🎜🎜🎜🎜🎜🎜🎜Saluran Kehadiran 🎜🎜Saluran Kehadiran membina keselamatan saluran peribadi dan menyediakan ciri tambahan: mengetahui siapa yang melanggan saluran saluran. Ini menjadikannya sangat mudah untuk membina aplikasi kolaboratif yang berkuasa, seperti apabila seorang pengguna menyemak imbas halaman, memberitahu pengguna lain yang menyemak imbas halaman yang sama. 🎜🎜🎜🎜🎜🎜🎜
danSaluran Kehadiran Dibenarkan
Semua saluran kehadiran juga adalah saluran peribadi; oleh itu, pengguna mesti diizinkan sebelum mereka boleh mengakses . Walau bagaimanapun, apabila mentakrifkan fungsi panggil balik kebenaran untuk saluran kehadiran, jika pengguna telah menyertai saluran itu,
true
tidak seharusnya dikembalikan, tetapi tatasusunan maklumat tentang pengguna harus dikembalikan.true
,而应该返回一个关于该用户信息的数组。由授权回调函数返回的数据能够在你的 JavaScript 应用程序中被 presence 频道事件监听器所使用。如果用户没有被授权加入该 presence 频道,那么你应该返回
rrreeefalse
或者null
:加入 Presence 频道
你可以使用 Echo 的
rrreeejoin
方法来加入 presence 频道。join
方法会返回一个实现了PresenceChannel
的对象,通过暴露listen
方法,允许你订阅here
、joining
和leaving
事件。here
回调函数会在你成功加入频道后被立即执行,并接收一个包含其他所有当前订阅该频道的用户的用户信息数组 。joining
方法会在新用户加入频道时被执行,而leaving
方法会在用户退出频道时被执行。广播到 Presence 频道
Presence 频道可以像公开和私有频道一样接收事件。使用一个聊天室的例子,我们可能想把
rrreeeNewMessage
事件广播到聊天室的 presence 频道。要实现它,我们将从事件的broadcastOn
方法中返回一个PresenceChannel
实例:就像公开或私有事件, presence 频道事件也可以使用
rrreeebroadcast
函数来广播。同样的,你也可以使用toOthers
方法将当前用户排除在广播接收者之外:你可以通过 Echo 的
Data yang dikembalikan oleh fungsi panggil balik kebenaran boleh digunakan oleh pendengar acara saluran kehadiran dalam aplikasi JavaScript anda. Jika pengguna tidak dibenarkan untuk menyertai saluran kehadiran, maka anda harus mengembalikanlisten
false
ataunull
: < div name="a2f9d5" data-unique="a2f9d5">Sertai saluran kehadiran🎜🎜Anda boleh menggunakan kaedahsertai
Echo untuk menyertai saluran kehadiran. Kaedahjoin
mengembalikan objek yang melaksanakanPresenceChannel
dan mendedahkan kaedahlisten
, membolehkan anda melanggandi sini
, < code>menyertaimeninggalkan
acara. 🎜rrreee🎜di sini Fungsi panggil balik akan dilaksanakan serta-merta selepas anda berjaya menyertai saluran dan menerima pelbagai maklumat pengguna yang mengandungi semua pengguna lain yang sedang melanggan saluran itu. Kaedah menyertai
akan dilaksanakan apabila pengguna baharu menyertai saluran dan kaedahmeninggalkan
akan dilaksanakan apabila pengguna keluar dari saluran.
🎜🎜🎜🎜Penyiaran ke Saluran Kehadiran🎜🎜Saluran kehadiran boleh menjadi umum dan Saluran peribadi menerima acara juga. Menggunakan contoh bilik sembang, kami mungkin mahu menyiarkan acaraNewMessage
ke saluran kehadiran bilik sembang. Untuk melaksanakannya, kami akan mengembalikan contohPresenceChannel
daripada kaedahbroadcastOn
acara: 🎜rrreee🎜Sama seperti acara awam atau persendirian, acara saluran kehadiran juga boleh digunakanbroadcast
berfungsi untuk menyiarkan. Begitu juga, anda juga boleh menggunakan kaedahtoOthers
untuk mengecualikan pengguna semasa daripada penerima siaran: 🎜rrreee🎜Anda boleh mendengar acara sertai melalui kaedahlisten
Echo: 🎜 rrreee🎜 🎜🎜🎜🎜🎜Acara Pelanggan
{Nota} Apabila menggunakan Penolak, jika anda ingin menghantar acara pelanggan, anda mesti mendayakan pilihan "Acara Pelanggan" dalam bahagian "Tetapan Aplikasi" pada App Backend.
Kadangkala, anda mungkin mahu menyiarkan acara kepada pelanggan lain yang berkaitan tanpa memberitahu aplikasi Laravel anda. Ini amat berguna apabila mengendalikan pemberitahuan untuk perkara "menaip sedang berjalan", seperti memaklumkan pengguna apl anda bahawa pengguna lain sedang menaip maklumat pada skrin tertentu.
Anda boleh menggunakan kaedah
rrreeewhisper
Echo untuk menyiarkan acara pelanggan:whisper
方法来广播客户端事件:你可以使用
rrreeelistenForWhisper
方法来监听客户端事件:消息通知
通过与将事件广播与 消息通知 配对,你的 JavaScript 应用程序可以在不刷新页面的情况下接收新的消息通知。在此之前,请确保你已经读过了如何使用 广播通知频道 的文档。
配置好使用广播频道的消息通知后,你可以使用 Echo 的
rrreeenotification
方法来监听广播事件。谨记,频道名称应该和接收消息通知的实体类名相匹配:在本例中,所有通过
Anda boleh menggunakan kaedahbroadcast
频道发送到AppUser
实例的消息通知都会被回调接收。一个针对App.User.{id}
频道的授权回调函数已经包含在 Laravel 框架内置的BroadcastServiceProvider
rrreeelistenForWhisper
untuk mendengar acara pelanggan: 🎜Pemberitahuan Mesej🎜🎜Dengan menggandingkan siaran acara dengan pemberitahuan mesej, aplikasi JavaScript anda boleh berkomunikasi tanpa memuat semula halaman. Terima pemberitahuan mesej baharu. Sebelum melakukan ini, pastikan anda telah membaca dokumentasi tentang cara menggunakan saluran pemberitahuan siaran. 🎜🎜Selepas mengkonfigurasi pemberitahuan mesej menggunakan saluran siaran, anda boleh menggunakan kaedahpemberitahuan Echo untuk mendengar acara siaran. Ingat, nama saluran harus sepadan dengan nama kelas entiti yang menerima pemberitahuan: 🎜rrreee🎜Dalam kes ini, semua pemberitahuan yang dihantar kepada contoh AppUser
melalui saluranbroadcast
akan diterima melalui panggilan balik. Fungsi panggil balik kebenaran untuk saluranApp.User.{id}
telah disertakan dalamBroadcastServiceProvider
terbina dalam rangka kerja Laravel. 🎜🎜Artikel ini pertama kali diterbitkan di laman web 🎜LearnKu.com🎜. 🎜🎜