방송 시스템
ㅋㅋ > Token
방송 시스템
소개
최신 웹 애플리케이션에서 WebSocket은 실시간으로 즉시 업데이트되는 사용자 인터페이스를 구현하는 데 사용됩니다. 서버의 데이터가 업데이트되면 업데이트 정보는 WebSocket 연결을 통해 클라이언트로 전송되어 처리됩니다. 이는 애플리케이션을 지속적으로 폴링하는 것보다 더 안정적이고 효율적인 옵션입니다.
이러한 유형의 애플리케이션을 구축하는 데 도움이 되도록 Laravel은 WebSocket 연결을 통해 이벤트를 더 쉽게 "브로드캐스트"할 수 있도록 합니다. Laravel 이벤트를 브로드캐스팅하면 서버 측과 클라이언트 측 JavaScript 애플리케이션 간에 동일한 이벤트 이름을 공유할 수 있습니다.
{참고} 이벤트 브로드캐스팅에 대해 자세히 알아보기 전에 Laravel 이벤트 및 리스너에 대한 모든 문서를 읽었는지 확인하세요.
Configuration
이벤트 방송에 대한 모든 구성은 config/broadcasting.php
구성 파일에 저장됩니다. Laravel에는 Pusher, Redis, 로컬 개발 및 디버깅을 위한 log
드라이버 등 여러 브로드캐스트 드라이버가 함께 제공됩니다. 또한 방송 시스템을 완전히 끌 수 있는 null
드라이버도 있습니다. 각 드라이버에 대한 예제 구성은 config/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
방송 서비스 제공업체
AppProvidersBroadcastServiceProvider
를 등록해야 합니다. 새로운 Laravel 애플리케이션의 경우 config/app.php
구성 파일의 providers
배열에서 공급자의 주석 처리를 제거하기만 하면 됩니다. 이 공급자를 사용하면 브로드캐스트 인증 경로와 콜백을 등록할 수 있습니다. CSRF 토큰
🎜Laravel Echo에는 다음에 대한 액세스가 필요합니다. 현재 세션의 CSRF 토큰입니다. 애플리케이션의head
HTML 요소가 CSRF 토큰(🎜npm install --save socket.io-client🎜)을 포함하는
meta
태그를 정의하는지 확인해야 합니다. 🎜푸셔
🎜를 사용하는 경우 Pusher 이벤트를 브로드캐스트하려면 Composer 패키지 관리자를 사용하여 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' });🎜그런 다음 <에서 Pusher 인증서를 구성해야 합니다. code>config/broadcasting.php 구성 파일. 이 파일에는 이미 Pusher 예제 구성이 포함되어 있으므로 Pusher 키, 비밀 및 애플리케이션 ID를 빠르게 지정할 수 있습니다.
config/broadcasting.php
파일의 pusher
구성 항목을 사용하면 Cluster: 🎜event(new ShippingStatusUpdated($update));와 같이 Pusher가 지원하는 추가
옵션
을 지정할 수도 있습니다. 🎜푸셔를 Laravel Echo와 함께 사용할 때 resources/assets/js/bootstrap.js
에서 Echo 객체를 인스턴스화해야 합니다. 파일 필수 브로드캐스터로 pusher
를 지정하십시오: 🎜<?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
🎜Redis 브로드캐스터를 사용하는 경우, Predis 라이브러리 설치: 🎜/** * 获取事件应该广播的频道。 * * @return array */ public function broadcastOn(){ return new PrivateChannel('order.'.$this->update->order_id); }🎜Redis 브로드캐스터는 Redis의 게시/구독 기능을 사용하여 메시지를 브로드캐스트하지만 메시지를 WebSocket 채널에 브로드캐스트하려면 Redis에서 메시지를 수신할 수 있는 WebSocket 서버와 페어링해야 합니다. 위로 가다. 🎜🎜Redis 브로드캐스터가 이벤트를 게시하면 해당 이벤트는 지정된 채널에 게시되며 전송되는 데이터는 JSON으로 인코딩된 문자열입니다. 이 문자열에는 이벤트 이름,
data
데이터 및 이벤트 소켓 ID를 생성한 사용자(사용 가능한 경우)가 포함됩니다. 🎜🎜🎜Socket.IO
Redis 브로드캐스터를 Socket.IO 서버와 페어링하려면 애플리케이션에 Socket.IO JavaScript 클라이언트 라이브러리를 도입해야 합니다. NPM 패키지 관리자를 통해 설치할 수 있습니다:
Broadcast::channel('order.{orderId}', function ($user, $orderId) { return $user->id === Order::findOrNew($orderId)->user_id; });
그런 다음 Echo를 인스턴스화할 때 socket.io
커넥터와 host
를 지정해야 합니다. 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); } }마지막으로 Laravel 호환 Socket.IO 서버를 실행해야 합니다. Laravel에는 공식적으로 내장된 Socket.IO 서버 구현이 없지만 커뮤니티 중심의 유지 관리 프로젝트 tlaverdure를 선택할 수 있습니다. /laravel-echo-서버, 현재 GitHub에서 호스팅됩니다.
개념 개요
🎜Laravel의 이벤트 방송을 사용하면 다음을 사용할 수 있습니다. 드라이버 기반 WebSocket은 서버 측 Laravel 이벤트를 클라이언트 측 JavaScript 애플리케이션에 브로드캐스트합니다. 현재 Laravel에는 Pusher 및 Redis 드라이버가 함께 제공됩니다. Laravel Echo의 Javascript 패키지를 사용하면 클라이언트 측에서 이벤트를 쉽게 사용할 수 있습니다. 🎜🎜이벤트는 공개 또는 비공개로 지정할 수 있는 "채널"을 통해 방송됩니다. 모든 방문자는 승인이나 인증 없이 공개 채널을 구독할 수 있습니다. 그러나 비공개 채널을 구독하려면 사용자가 채널에 대해 인증 및 승인을 받아야 합니다. 🎜🎜🎜예제 애플리케이션 사용
🎜이벤트에 대해 자세히 알아보기 방송의 각 구성요소를 살펴보기에 앞서, 전자상거래 웹사이트를 예로 들어 개요를 살펴보겠습니다. Pusher 또는 Laravel Echo 구성에 대한 자세한 내용은 논의하지 않습니다. 이에 대해서는 이 문서의 다른 부분에서 자세히 설명합니다. 🎜🎜우리 애플리케이션에는 사용자가 주문 배송 상태를 볼 수 있는 페이지가 있다고 가정합니다. 배송 상태가 업데이트되면 트리거되는ShippingStatusUpdated
이벤트가 있습니다: 🎜/** * 事件的广播名称。 * * @return string */ public function broadcastAs(){ return 'server.created'; }🎜🎜
ShouldBroadcast
인터페이스
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
사용자가 주문을 볼 때 상태 업데이트를 확인하기 위해 페이지를 새로 고칠 필요가 없도록 하고 싶습니다. 업데이트가 발생하면 고객에게 업데이트 정보를 적극적으로 방송할 수 있기를 바랍니다. 따라서 ShouldBroadcast
인터페이스를 구현하려면 ShippingStatusUpdated
이벤트를 표시해야 합니다. 이렇게 하면 Laravel이 이벤트가 트리거될 때 이벤트를 브로드캐스트하게 됩니다:
/** * 事件被推送到的队列名称。 * * @var string */ public $broadcastQueue = 'your-queue-name';
주어진 이벤트를 방송해야 한다고 Laravel에 알리려면 이벤트 클래스에 然后,你只需要像你平时那样 触发事件 。一旦事件被触发,一个 队列任务 会自动广播事件到你指定的广播驱动上。 Laravel 默认会使用事件的类名作为广播名称来广播事件。不过,你也可以在事件类中定义一个 如果你使用了 当一个事件被广播时,其所有的 不过,如果你想更细粒度地控制你的广播有效载荷,你可以向你的事件中添加一个 비공개 채널: 기본적으로 각 방송 이벤트는 如果你想使用 有时,你想在给定条件为 true 的情况下才广播你的事件。你可以通过在事件类中添加一个 对于私有频道,用户只有被授权之后才能监听。实现过程是用户向你的 Laravel 应用程序发起一个携带频道名称的 HTTP 请求,由你的应用程序判断该用户是否能够监听该频道。在使用 Laravel Echo 时,授权订阅私有频道的 HTTP 请求会自动发送;尽管如此,你仍需定义相应的路由来响应这些请求。 幸运的是,在 Laravel 中我们可以很容易地定义路由来响应频道授权请求。在 Laravel 自带的 默认情况下,Echo 将使用 다음으로 채널 인증을 실제로 처리하는 로직을 정의해야 합니다. 이 로직은 애플리케이션과 함께 제공되는 所有的授权回调接收当前认证用户作为第一个参数,任何额外的通配符参数作为后续参数。在本例中,我们使用 就像 HTTP 路由一样,频道路由也可以利用显式或隐式 路由模型绑定 。例如,你可以请求接收一个真正的 私有频道和在线广播频道通过应用程序的默认授权验证对当前用户身份进行验证。 如果用户未经过授权验证,则会自动拒绝通道授权,并且永远不会执行授权回调。 但是,您可以分配多个自定义防护,以便在必要时对传入请求进行身份验证: 如果你的应用程序用到了许多不同的频道,你的 接下来,在你的 最后,你可以将频道的授权逻辑放入频道类的 모든 인증 콜백은 현재 인증된 사용자를 첫 번째 매개변수로 받고 추가 와일드카드 매개변수를 후속 매개변수로 받습니다. 이 예에서는 HTTP 라우팅과 마찬가지로 채널 라우팅도 명시적 또는 암시적 라우팅 모델 바인딩을 활용할 수 있습니다. 예를 들어 문자열이나 숫자로 된 주문 ID 대신 실제 이벤트를 정의하고 当创建一个会用到事件广播的应用程序时,你可以使用 不过, 为了更好地理解什么时候使用 然而,别忘了,我们还广播了任务的创建。如果你的 JavaScript 应用程序正在监听该事件以便添加任务至任务列表,任务列表中将出现重复的任务:一个来自路由响应,另一个来自广播。你可以通过使用 {注} 为了能调用 当你初始化 Laravel Echo 实例的时候,一个套接字 ID 会被分配到该连接。如果你使用了 Vue 和 Axios ,该套接字 ID 会自动地以 你如果你没有使用 Vue 和 Axios ,则需要手动配置 JavaScript 应用程序来发送 Laravel Echo는 JavaScript 라이브러리입니다. 이 라이브러리를 사용하면 채널을 구독하고 Laravel에서 방송하는 이벤트를 듣는 것이 매우 쉬워집니다. NPM 패키지 관리자를 통해 Echo를 설치할 수 있습니다. 이 경우 Pusher 브로드캐스터를 사용할 것이므로 安装好 Echo 之后,你就可以在应用程序的 JavaScript 中创建一个全新的 Echo 实例。做这件事的一个理想的地方是在 Laravel 框架自带的 当你使用 如果您已经有一个希望 Echo 使用的 Pusher 或 Socket.io 客户端实例,您可以通过 安装并实例化 Echo 之后, 你就可以开始监听事件广播了。首先,使用 如果你想监听私有频道上的事件,请使用 要离开频道,您可以在 Echo 实例上调用 如果您想离开私有频道和在线频道,您可以调用 你可能已经注意到在上面的例子中,我们并没有为事件类指定完整的命名空间。这是因为 Echo 会默认事件都在 另外,你可以在使用 Echo 订阅事件的时候为事件类加上 rrreee 이벤트 듣기Echo를 설치하고 인스턴스화한 후 이벤트 방송 청취를 시작할 수 있습니다. 먼저 모든 상태 채널은 비공개 채널이기도 하므로 사용자는 액세스하기 전에 승인을 받아야 합니다. 그러나 현재 상태 채널에 대한 인증 콜백 함수를 정의할 때 사용자가 이미 채널에 가입한 경우 由授权回调函数返回的数据能够在你的 JavaScript 应用程序中被 presence 频道事件监听器所使用。如果用户没有被授权加入该 presence 频道,那么你应该返回 你可以使用 Echo 的 Presence 频道可以像公开和私有频道一样接收事件。使用一个聊天室的例子,我们可能想把 就像公开或私有事件, presence 频道事件也可以使用 你可以通过 Echo 的 {참고} Pusher를 사용할 때 클라이언트 이벤트를 보내려면 App Backend의 "애플리케이션 설정" 섹션에서 "클라이언트 이벤트" 옵션을 활성화해야 합니다. 때로는 Laravel 애플리케이션에 알리지 않고 연결된 다른 클라이언트에게 이벤트를 방송하고 싶을 수도 있습니다. 이는 다른 사용자가 특정 화면에 정보를 입력하고 있음을 앱 사용자에게 알리는 등 "입력 진행 중"에 대한 알림을 처리할 때 특히 유용합니다. Echo의 你可以使用 通过与将事件广播与 消息通知 配对,你的 JavaScript 应用程序可以在不刷新页面的情况下接收新的消息通知。在此之前,请确保你已经读过了如何使用 广播通知频道 的文档。 配置好使用广播频道的消息通知后,你可以使用 Echo 的 在本例中,所有通过 ShouldBroadcast
인터페이스에서는 이벤트가 broadcastOn
메서드를 정의해야 합니다. 이 메소드는 이벤트가 방송되는 채널을 지정합니다. (Artisan 명령어를 통해) 생성된 이벤트 클래스에는 빈 broadcastOn
메서드가 이미 사전 정의되어 있으므로 세부 정보를 완료하기만 하면 됩니다. 주문 작성자만 상태 업데이트를 볼 수 있기를 바랍니다. 따라서 이 주문에 연결된 비공개 채널에 이벤트를 방송해야 합니다: <?php
use Illuminate\Contracts\Broadcasting\ShouldBroadcastNow;
class ShippingStatusUpdated implements ShouldBroadcastNow{
//
}
routes/channels.php
파일에서 채널 인증 규칙을 정의할 수 있습니다. 이 경우, 주문의 실제 작성자만 들을 수 있도록 보기가 비공개 order.1
채널을 수신하는 모든 사용자를 인증해야 합니다. /**
* 判定事件是否可以广播。
*
* @return bool
*/
public function broadcastWhen(){
return $this->value > 100;
}
🎜channel
메소드 두 개의 매개변수, 즉 채널 이름과 콜백 함수를 수신합니다. 이 매개변수는 true
또는 false
를 반환하여 사용자가 채널을 들을 수 있는 권한이 있는지 여부를 나타냅니다. 🎜🎜모든 인증 콜백은 현재 인증된 사용자를 첫 번째 매개변수로 받고 추가 와일드카드 매개변수를 후속 매개변수로 받습니다. 이 예에서는 {orderId}
자리 표시자를 사용하여 채널 이름의 "ID" 부분이 와일드카드임을 나타냅니다. 🎜private
메소드를 사용하여 비공개 채널을 구독합니다. 그런 다음 listen
메서드를 사용하여 ShippingStatusUpdated
이벤트를 수신합니다. 기본적으로 이벤트의 모든 공공 자산은 방송 이벤트에 포함됩니다. 🎜Broadcast::routes();
🎜🎜🎜🎜🎜🎜방송 이벤트 정의
IlluminateContractsBroadcastingShouldBroadcast
인터페이스를 구현하기만 하면 됩니다. 이 인터페이스는 프레임워크에서 생성된 모든 이벤트 클래스로 가져왔으므로 자신의 이벤트에 쉽게 추가할 수 있습니다. IlluminateContractsBroadcastingShouldBroadcast
接口即可。该接口已被导入到所有由框架生成的事件类中,所以你可以很方便地将它添加到你自己的事件中。ShouldBroadcast
接口要求你实现一个方法: broadcastOn
。 该方法返回一个频道或者一个频道数组,事件会被广播到这些频道。这些频道必须是 Channel
、PrivateChannel
或者 PresenceChannel
的实例。 Channel
代表任何用户都可以订阅的公开频道, 而 PrivateChannels
和 PresenceChannels
则代表需要 频道授权 的私有频道:Broadcast::routes($attributes);
广播名称
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;
});
broadcastWith
ShouldBroadcast
인터페이스를 사용하려면 broadcastOn
메소드를 구현해야 합니다. 이 메소드는 이벤트가 브로드캐스트될 채널 또는 채널 배열을 반환합니다. 이러한 채널은 Channel
, PrivateChannel
또는 PresenceChannel
의 인스턴스여야 합니다. 채널
은 모든 사용자가 구독할 수 있는 공개 채널을 나타내고, PrivateChannels
및 PresenceChannels
는 채널 승인 Broadcast::channel('channel', function() {
// ...
}, ['guards' => ['web', 'admin']])
그런 다음 평소처럼 이벤트를 실행하기만 하면 됩니다. 이벤트가 트리거되면 대기열 작업은 사용자가 지정한 브로드캐스트 드라이버에 이벤트를 자동으로 브로드캐스트합니다. 브로드캐스트 이름
🎜Laravel은 이벤트 클래스 이름을 다음과 같이 사용합니다. 기본값 이벤트를 브로드캐스트하는 브로드캐스트 이름입니다. 그러나 이벤트 클래스에서 broadcastAs
메서드를 정의하여 브로드캐스트 이름을 사용자 지정할 수도 있습니다. 🎜php artisan make:channel OrderChannel
🎜 broadcastAs
메서드를 사용하여 브로드캐스트 이름을 사용자 지정하는 경우 다음을 수행해야 합니다. 리스너를 등록할 때 .
접두사를 추가하세요. 이렇게 하면 Echo가 앱의 네임스페이스를 이벤트 앞에 추가하지 않도록 지시합니다. 🎜use App\Broadcasting\OrderChannel;
Broadcast::channel('order.{order}', OrderChannel::class);
🎜🎜🎜broadcast 데이터
🎜이벤트가 브로드캐스트되면 모든 공개
속성이 자동으로 직렬화되어 이벤트 페이로드로 브로드캐스트됩니다. 이를 통해 JavaScript 애플리케이션에서 모든 이벤트 속성에 액세스할 수 있습니다. 데이터. 예를 들어, 이벤트에 Eloquent 모델이 포함된 단일 공개 $user
속성이 있는 경우 이벤트의 브로드캐스트 페이로드는 다음과 같습니다. 🎜<?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;
}
}
🎜그러나 더 세부적으로 제어하려면 브로드캐스트 페이로드를 사용하려면 이벤트에 broadcastWith
메서드를 추가할 수 있습니다. 이 메소드는 이벤트 페이로드로 브로드캐스트하려는 데이터 배열을 반환합니다. 🎜event(new ShippingStatusUpdated($update));
🎜🎜🎜🎜🎜🎜Broadcast Queue
queue.php
구성 파일에 지정된 기본 대기열 연결에 해당하는 기본 대기열로 푸시됩니다. 이벤트 클래스에서 broadcastQueue
속성을 정의하여 브로드캐스터가 사용하는 대기열을 사용자 정의할 수 있습니다. 이 속성을 사용하려면 브로드캐스트할 때 사용할 큐 이름을 지정해야 합니다. queue.php
配置文件中指定的默认队列连接相应的默认队列中。你可以在事件类中定义一个 broadcastQueue
属性来自定义广播器所使用的队列。该属性需要你指定广播时你想要用的队列名称:broadcast(new ShippingStatusUpdated($update));
sync
队列而不是默认队列驱动来广播事件,你可以实现 ShouldBroadcastNow
接口而不是 ShouldBroadcast
:broadcast(new ShippingStatusUpdated($update))->toOthers();
广播条件
broadcastWhen
方法来定义这些条件:axios.post('/task', task)
.then((response) => {
this.tasks.push(respo
});
授权频道
定义授权路由
BroadcastServiceProvider
中,你可以看到对 Broadcast::routes
方法的调用。该方法会注册 /broadcasting/auth
路由来处理授权请求:var socketId = Echo.socketId();
Broadcast::routes
方法会自动将它的路由置入 web
中间件组中;不过,如果你想自定义指定的属性,你可以向该方法传递一个路由属性数组:npm install --save laravel-echo pusher-js
自定义授权端点
/broadcasting/auth
端点来授权频道访问。 但是,您可以通过将 authEndpoint
import Echo from "laravel-echo"
window.Echo = new Echo({
broadcaster: 'pusher',
key: 'your-pusher-key'
});
이벤트를 브로드캐스트하기 위해 기본 큐 드라이버 대신 sync
큐를 사용하려는 경우 를 구현할 수 있습니다.
인터페이스: ShouldBroadcast
대신 ShouldBroadcastNowwindow.Echo = new Echo({
broadcaster: 'pusher',
key: 'your-pusher-key',
cluster: 'eu',
encrypted: true
});
broadcastWhen
메소드를 추가하여 이러한 조건을 정의할 수 있습니다. 🎜const client = require('pusher-js');
window.Echo = new Echo({
broadcaster: 'pusher',
key: 'your-pusher-key',
client: client
});
🎜🎜🎜승인된 채널
🎜비공개 채널의 경우 사용자는 승인된 채널만 모니터링할 수 있습니다. 구현 프로세스는 사용자가 Laravel 애플리케이션에 채널 이름을 전달하는 HTTP 요청을 시작하고 애플리케이션은 사용자가 채널을 들을 수 있는지 여부를 결정하는 것입니다. Laravel Echo🎜를 사용하면 비공개 채널 구독을 승인하는 HTTP 요청이 자동으로 전송되지만 이러한 요청에 응답하려면 적절한 경로를 정의해야 합니다. 🎜🎜🎜🎜BroadcastServiceProvider
에서 Broadcast::routes
메서드에 대한 호출을 볼 수 있습니다. 이 메소드는 승인 요청을 처리하기 위해 /broadcasting/auth
경로를 등록합니다. 🎜Echo.channel('orders')
.listen('OrderShipped', (e) => {
console.log(e.order.name);
});
🎜 Broadcast::routes
메소드는 해당 경로를 web
에 자동으로 배치합니다. code code> 그러나 지정된 속성을 사용자 정의하려면 라우팅 속성 배열을 이 메소드에 전달할 수 있습니다: 🎜Echo.private('orders')
.listen(...)
.listen(...)
.listen(...);
/broadcasting/auth
엔드포인트를 사용하여 채널 액세스를 인증합니다. 그러나 authEndpoint
구성 옵션을 Echo 인스턴스에 전달하여 자체 인증 엔드포인트를 지정할 수 있습니다. 🎜Echo.leaveChannel('orders');
🎜🎜🎜🎜🎜🎜인증 콜백 정의
routes/channels.php
파일에서 완성됩니다. 이 파일에서 Broadcast::channel
메서드를 사용하여 채널 인증 콜백을 등록할 수 있습니다. routes/channels.php
文件中完成。在这个文件中,你可以使用 Broadcast::channel
方法来注册频道授权回调:Echo.leave('orders');
channel
方法接收两个参数:频道名称和一个回调函数,该回调通过返回 true
或者 false
来表示用户是否被授权监听该频道。{orderId}
占位符来表示频道名称的 「ID」 部分是通配符。授权回调模型绑定
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);
}
channel
메서드는 채널 이름과 콜백이라는 두 가지 매개변수를 받습니다. 함수, 이 콜백은 true
또는 false
를 반환하여 사용자가 채널을 들을 수 있는 권한이 있는지 여부를 나타냅니다. {orderId}
자리 표시자를 사용하여 채널 이름의 "ID" 부분이 와일드카드임을 나타냅니다. 승인 콜백 모델 바인딩
Order
모델 인스턴스를 받도록 요청할 수 있습니다. broadcast(new NewMessage($message));
broadcast(new NewMessage($message))->toOthers();
routes/channels.php
파일이 매우 커질 수 있습니다. 따라서 클로저를 사용하여 채널을 인증하는 대신 채널 클래스를 사용할 수 있습니다. 채널 클래스를 생성하려면 make:channel
Artisan 명령어를 사용하세요. 이 명령은 App/Broadcasting
디렉토리에 새 채널 클래스를 배치합니다. 🎜Echo.join(`chat.${roomId}`)
.here(...)
.joining(...)
.leaving(...)
.listen('NewMessage', (e) => {
//
});
🎜다음으로 routes/channels.php
파일에 채널을 등록하세요. 🎜Echo.private('chat')
.whisper('typing', {
name: this.user.name
});
🎜마지막으로 채널 클래스 /code>의 join<에 채널 인증 논리를 넣을 수 있습니다. 방법.
join
메소드는 일반적으로 채널 승인 폐쇄에 넣는 것과 동일한 논리를 보유합니다. 물론, 채널 모델 바인딩을 활용할 수도 있습니다: 🎜Echo.private('chat')
.listenForWhisper('typing', (e) => {
console.log(e.name);
});
🎜🎜{참고} Laravel의 다른 많은 클래스와 마찬가지로 채널 클래스는 서비스 컨테이너를 통해 자동으로 확인됩니다. 따라서 생성자에서 채널 클래스에 필요한 종속성을 유형 힌트로 지정할 수 있습니다. 🎜🎜🎜🎜🎜🎜🎜🎜Broadcast event
ShouldBroadcast
인터페이스를 구현하도록 표시한 후 event
함수를 통해 이벤트를 트리거하기만 하면 됩니다. 이벤트 디스패처는 ShouldBroadcast
인터페이스로 표시된 이벤트를 인식하고 이를 브로드캐스트 대기열에 푸시합니다. ShouldBroadcast
接口之后,你所要做的仅仅是通过 event
函数来触发该事件。事件分发器会识别出标记了实现 ShouldBroadcast
接口的事件,并将其推送到队列中进行广播:Echo.private(`App.User.${userId}`)
.notification((notification) => {
console.log(notification.type);
});
只广播给他人
broadcast
函数来代替 event
。和 event
函数一样, broadcast
函数将事件分发到服务端监听器:broadcast
函数还有一个允许你将当前用户排除在广播接收者之外的 toOthers
方法:toOthers
方法,让我们假设有一个任务列表的应用程序,用户可以通过输入任务名来新建任务。要新建任务,你的应用程序需要发起一个请求到一个 /task
路由,该路由会广播任务的创建,并返回新任务的 JSON 响应。当你的 JavaScript 应用程序从路由收到响应后,它会直接将新任务插入到任务列表中,就像这样:toOthers
方法告知广播器不要将事件广播到当前用户来解决这个问题。toOthers
方法,你的事件必须使用 IlluminateBroadcastingInteractsWithSockets
trait 。配置
X-Socket-ID
头的方式添加到每一个传出请求中。那么,当你调用 toOthers
方法时,Laravel 会从请求头中取出套接字 ID ,并告知广播器不要广播任何消息到带有这个套接字 ID 的连接上。X-Socket-ID
请求头。你可以用 Echo.socketId
rrreee다른 사람에게만 방송
이벤트 방송을 사용하는 애플리케이션을 만들 때 broadcast
기능을 사용하여 event<를 대체할 수 있습니다. /코드>.
event
함수와 마찬가지로 broadcast
함수는 서버측 리스너에게 이벤트를 배포합니다. broadcast
함수에는 추가 기능도 있습니다. 현재 사용자를 브로드캐스트 수신자에서 제외하는 toOthers
메서드를 사용할 수 있습니다. rrreee
toOthers
메서드를 언제 사용해야 하는지 더 잘 이해하기 위해 작업이 있다고 가정해 보겠습니다. 목록 응용 프로그램에서 사용자는 작업 이름을 입력하여 새 작업을 생성할 수 있습니다. 새 작업을 생성하기 위해 애플리케이션은 작업 생성을 브로드캐스트하고 새 작업에 대한 JSON 응답을 반환하는 /task
경로에 요청합니다. JavaScript 애플리케이션이 경로에서 응답을 받으면 다음과 같이 새 작업을 작업 목록에 직접 삽입합니다. {참고}
toOthers
메서드를 호출하려면 이벤트가 IlluminateBroadcastingInteractsWithSockets
특성을 사용해야 합니다. 구성
🎜Laravel Echo 인스턴스를 초기화하면 소켓 ID가 연결에 할당됩니다. Vue🎜 및 Axios🎜를 사용하는 경우 이 소켓 ID는 모든 발신에 자동으로 추가됩니다. X-Socket-ID
헤더로 요청합니다. 그런 다음 toOthers
메소드를 호출하면 Laravel은 요청 헤더에서 소켓 ID를 꺼내고 브로드캐스터에게 이 소켓 ID가 있는 연결에 메시지를 브로드캐스트하지 말라고 지시합니다. 🎜🎜Vue 및 Axios를 사용하지 않는 경우 X-Socket-ID
요청 헤더를 보내도록 JavaScript 애플리케이션을 수동으로 구성해야 합니다. Echo.socketId
메소드를 사용하여 소켓 ID를 얻을 수 있습니다: 🎜rrreee🎜🎜🎜🎜🎜🎜🎜Receive Broadcast🎜🎜🎜🎜🎜🎜🎜Laravel Echo 설치
pusher-js
패키지도 설치합니다. pusher-js
包:resources/js/bootstrap.js
文件的底部:pusher
连接器来创建一个 Echo 实例的时候,还可以指定 cluster
以及连接是否需要加密:使用现有客户端实例
client
配置选项将其传递给 Echo:对事件进行监听
channel
方法获取一个频道实例,然后调用 listen
方法来监听指定的事件:private
方法。你可以通过链式调用 listen
方法来监听单个频道上的多个事件:退出频道
leaveChannel
方法:leave
方法:命名空间
AppEvents
命名空间下。不过,你可以在实例化 Echo 时传递一个 namespace
配置项来指定根命名空间:.
rrreeeresources/js/bootstrap.js
파일의 하단입니다: pusher
커넥터를 사용하는 경우 Echo 인스턴스를 생성할 때 cluster
를 지정하고 연결을 암호화해야 하는지 여부도 지정할 수 있습니다. rrreee 기존 클라이언트 클라이언트 인스턴스
클라이언트
구성 옵션을 통해 이를 Echo에 전달할 수 있습니다:
channel
메서드를 사용하여 채널 인스턴스를 가져온 다음 listen
메서드를 호출하여 지정된 이벤트를 수신합니다. listen
메소드를 연결하여 단일 채널에서 여러 이벤트를 들을 수 있습니다: leaveChannel
메서드를 호출하면 됩니다. 🎜rrreee🎜비공개 채널과 온라인 채널에서 나가려면 다음을 수행하세요. leave
메소드 호출: 🎜rrreee🎜🎜🎜AppEvents
네임스페이스 아래에 두기 때문입니다. 그러나 Echo를 인스턴스화할 때 네임스페이스
구성 항목을 전달하여 루트 네임스페이스를 지정할 수 있습니다. 🎜rrreee🎜 또한 Echo를 사용하여 이벤트를 구독할 때 이벤트 클래스에 를 추가할 수 있습니다. /코드> 접두사. 이를 통해 정규화된 클래스 이름을 지정할 수 있습니다. 🎜rrreee🎜🎜🎜🎜🎜🎜🎜Presence 채널 🎜🎜Presence 채널은 비공개 채널의 보안을 기반으로 하며 채널 채널을 구독하는 사람을 파악하는 추가 기능을 제공합니다. 이를 통해 한 사용자가 페이지를 검색할 때 같은 페이지를 검색하고 있는 다른 사용자에게 알리는 등 강력한 협업 애플리케이션을 매우 쉽게 구축할 수 있습니다. 🎜🎜🎜🎜🎜🎜🎜
및 승인된 상태 채널
true
가 반환되어서는 안 되지만 사용자에 대한 정보 배열이 반환되어야 합니다. true
,而应该返回一个关于该用户信息的数组。false
或者 null
:加入 Presence 频道
join
方法来加入 presence 频道。 join
方法会返回一个实现了 PresenceChannel
的对象,通过暴露 listen
方法,允许你订阅 here
、 joining
和 leaving
事件。here
回调函数会在你成功加入频道后被立即执行,并接收一个包含其他所有当前订阅该频道的用户的用户信息数组 。 joining
方法会在新用户加入频道时被执行,而 leaving
方法会在用户退出频道时被执行。广播到 Presence 频道
NewMessage
事件广播到聊天室的 presence 频道。要实现它,我们将从事件的 broadcastOn
方法中返回一个 PresenceChannel
实例:broadcast
函数来广播。同样的,你也可以使用 toOthers
方法将当前用户排除在广播接收者之外:listen
false
또는 null
을 반환해야 합니다. < div name="a2f9d5" data-unique="a2f9d5">프레즌스 채널에 참여하세요🎜🎜Echo의 join
메소드를 사용하여 프레즌스 채널에 참여할 수 있습니다. join
메소드는 listen
메소드를 노출하여 PresenceChannel
을 구현하는 객체를 반환하므로 여기
, < code>참여탈퇴
이벤트. 🎜rrreee🎜여기
콜백 함수는 채널에 성공적으로 참여하고 현재 채널을 구독하고 있는 다른 모든 사용자가 포함된 일련의 사용자 정보를 받은 후 즉시 실행됩니다. joining
메소드는 새로운 사용자가 채널에 참여할 때 실행되고, leaving
메소드는 사용자가 채널을 나갈 때 실행됩니다.
🎜🎜NewMessage
이벤트를 채팅방의 현재 상태 채널에 브로드캐스트할 수 있습니다. 이를 구현하기 위해 이벤트의 broadcastOn
메서드에서 PresenceChannel
인스턴스를 반환합니다. 🎜rrreee🎜공개 또는 비공개 이벤트와 마찬가지로 현재 상태 채널 이벤트도 사용할 수 있습니다. 방송
함수를 사용하여 방송합니다. 마찬가지로 toOthers
메서드를 사용하여 브로드캐스트 수신기에서 현재 사용자를 제외할 수도 있습니다. 🎜rrreee🎜Echo의 listen
메서드를 통해 조인 이벤트를 들을 수 있습니다. 🎜 rrreee🎜 🎜🎜🎜🎜🎜클라이언트 이벤트
whisper
메서드를 사용하여 클라이언트 이벤트를 브로드캐스트할 수 있습니다. whisper
方法来广播客户端事件:listenForWhisper
方法来监听客户端事件:消息通知
notification
方法来监听广播事件。谨记,频道名称应该和接收消息通知的实体类名相匹配:broadcast
频道发送到 AppUser
实例的消息通知都会被回调接收。一个针对 App.User.{id}
频道的授权回调函数已经包含在 Laravel 框架内置的 BroadcastServiceProvider
rrreeelistenForWhisper
메서드를 사용하여 클라이언트 이벤트를 수신할 수 있습니다. 🎜메시지 알림🎜🎜이벤트 브로드캐스트를 메시지 알림과 페어링하면 JavaScript 애플리케이션이 페이지를 새로 고치지 않고도 통신할 수 있습니다. 새 메시지 알림을 받습니다. 이 작업을 수행하기 전에 브로드캐스트 알림 채널을 사용하는 방법에 대한 설명서를 읽었는지 확인하세요. 🎜🎜방송 채널을 사용하여 메시지 알림을 구성한 후 Echo의 알림
메서드를 사용하여 방송 이벤트를 수신할 수 있습니다. 채널 이름은 알림을 수신하는 엔터티의 클래스 이름과 일치해야 합니다. 🎜rrreee🎜이 경우 broadcast
채널을 통해 AppUser
인스턴스로 전송된 모든 알림은 콜백으로 수신되었습니다. App.User.{id}
채널에 대한 인증 콜백 함수는 Laravel 프레임워크의 내장 BroadcastServiceProvider
에 이미 포함되어 있습니다. 🎜🎜이 글은 🎜LearnKu.com🎜 웹사이트에 처음 게시되었습니다. 🎜🎜