Skip to content

브로드캐스팅

소개

많은 현대 웹 애플리케이션에서 웹소켓은 실시간으로 업데이트되는 사용자 인터페이스를 구현하는 데 사용됩니다. 서버에서 일부 데이터가 업데이트되면 일반적으로 클라이언트에서 처리할 수 있도록 웹소켓 연결을 통해 메시지가 전송됩니다. 웹소켓은 UI에 반영되어야 하는 데이터 변경 사항을 위해 애플리케이션 서버를 지속적으로 폴링하는 것보다 더 효율적인 대안을 제공합니다.

예를 들어, 애플리케이션이 사용자의 데이터를 CSV 파일로 내보내서 이메일로 보낼 수 있다고 가정해 봅시다. 하지만 이 CSV 파일을 생성하는 데 몇 분이 걸리므로 큐 작업 내에서 CSV를 만들고 메일링하도록 선택합니다. CSV가 생성되어 사용자에게 메일로 전송되면 이벤트 브로드캐스팅을 사용하여 애플리케이션의 JavaScript에서 수신하는 App\Events\UserDataExported 이벤트를 디스패치할 수 있습니다. 이벤트가 수신되면 페이지를 새로 고칠 필요 없이 CSV가 이메일로 전송되었다는 메시지를 사용자에게 표시할 수 있습니다.

이러한 유형의 기능을 구축하는 데 도움이 되도록 Laravel은 서버 측 Laravel 이벤트를 웹소켓 연결을 통해 쉽게 "브로드캐스트"할 수 있도록 합니다. Laravel 이벤트를 브로드캐스팅하면 서버 측 Laravel 애플리케이션과 클라이언트 측 JavaScript 애플리케이션 간에 동일한 이벤트 이름과 데이터를 공유할 수 있습니다.

브로드캐스팅의 핵심 개념은 간단합니다. 클라이언트는 프런트엔드에서 명명된 채널에 연결하는 반면, Laravel 애플리케이션은 백엔드에서 이러한 채널로 이벤트를 브로드캐스트합니다. 이러한 이벤트에는 프런트엔드에서 사용할 수 있도록 하려는 추가 데이터가 포함될 수 있습니다.

지원되는 드라이버

기본적으로 Laravel에는 Laravel Reverb, Pusher ChannelsAbly의 세 가지 서버 측 브로드캐스팅 드라이버가 포함되어 있습니다.

lightbulb

이벤트 브로드캐스팅을 시작하기 전에 이벤트 및 리스너에 대한 Laravel 문서를 읽었는지 확인하세요.

서버 측 설치

Laravel의 이벤트 브로드캐스팅을 시작하려면 Laravel 애플리케이션 내에서 몇 가지 구성을 수행하고 몇 가지 패키지를 설치해야 합니다.

이벤트 브로드캐스팅은 Laravel 이벤트가 Laravel Echo(JavaScript 라이브러리)에서 브라우저 클라이언트 내에서 수신할 수 있도록 브로드캐스트하는 서버 측 브로드캐스팅 드라이버에 의해 수행됩니다. 걱정하지 마세요. 설치 프로세스의 각 부분을 단계별로 안내해 드리겠습니다.

구성

애플리케이션의 모든 이벤트 브로드캐스팅 구성은 config/broadcasting.php 구성 파일에 저장됩니다. 이 디렉터리가 애플리케이션에 존재하지 않더라도 걱정하지 마세요. install:broadcasting Artisan 명령을 실행하면 생성됩니다.

Laravel은 기본적으로 여러 브로드캐스트 드라이버를 지원합니다. Laravel Reverb, Pusher Channels, Ably, 로컬 개발 및 디버깅을 위한 log 드라이버입니다. 또한 테스트 중에 브로드캐스팅을 비활성화할 수 있는 null 드라이버가 포함되어 있습니다. config/broadcasting.php 구성 파일에 이러한 각 드라이버에 대한 구성 예제가 포함되어 있습니다.

설치

기본적으로 새로운 Laravel 애플리케이션에서는 브로드캐스팅이 활성화되어 있지 않습니다. install:broadcasting Artisan 명령을 사용하여 브로드캐스팅을 활성화할 수 있습니다.

php artisan install:broadcasting

install:broadcasting 명령어는 config/broadcasting.php 설정 파일을 생성합니다. 또한, 이 명령어는 애플리케이션의 브로드캐스트 권한 부여 경로 및 콜백을 등록할 수 있는 routes/channels.php 파일을 생성합니다.

큐 설정

이벤트를 브로드캐스팅하기 전에 먼저 큐 워커를 설정하고 실행해야 합니다. 모든 이벤트 브로드캐스팅은 큐에 대기된 작업(queued jobs)을 통해 이루어지므로 애플리케이션의 응답 시간이 브로드캐스팅되는 이벤트에 의해 심각하게 영향을 받지 않습니다.

Reverb

install:broadcasting 명령어를 실행하면 Laravel Reverb 설치 여부를 묻는 메시지가 표시됩니다. 물론 Composer 패키지 관리자를 사용하여 Reverb를 수동으로 설치할 수도 있습니다.

composer require laravel/reverb

패키지가 설치되면 Reverb의 설치 명령어를 실행하여 설정을 게시하고, Reverb에 필요한 환경 변수를 추가하고, 애플리케이션에서 이벤트 브로드캐스팅을 활성화할 수 있습니다.

php artisan reverb:install

자세한 Reverb 설치 및 사용 지침은 Reverb 문서에서 확인할 수 있습니다.

Pusher Channels

Pusher Channels를 사용하여 이벤트를 브로드캐스팅하려는 경우, Composer 패키지 관리자를 사용하여 Pusher Channels PHP SDK를 설치해야 합니다.

composer require pusher/pusher-php-server

다음으로 config/broadcasting.php 설정 파일에서 Pusher Channels 자격 증명을 구성해야 합니다. 예시 Pusher Channels 구성이 이미 이 파일에 포함되어 있으므로, 키, 비밀 키 및 애플리케이션 ID를 빠르게 지정할 수 있습니다. 일반적으로 애플리케이션의 .env 파일에서 Pusher Channels 자격 증명을 구성해야 합니다.

PUSHER_APP_ID="your-pusher-app-id"
PUSHER_APP_KEY="your-pusher-key"
PUSHER_APP_SECRET="your-pusher-secret"
PUSHER_HOST=
PUSHER_PORT=443
PUSHER_SCHEME="https"
PUSHER_APP_CLUSTER="mt1"

config/broadcasting.php 파일의 pusher 설정은 클러스터와 같이 Channels에서 지원하는 추가적인 options을 지정할 수 있도록 합니다.

그런 다음, 애플리케이션의 .env 파일에서 BROADCAST_CONNECTION 환경 변수를 pusher로 설정하십시오.

BROADCAST_CONNECTION=pusher

마지막으로, 클라이언트 측에서 브로드캐스트 이벤트를 수신할 Laravel Echo를 설치하고 구성할 준비가 되었습니다.

Ably

lightbulb

아래 문서는 "Pusher 호환" 모드에서 Ably를 사용하는 방법을 설명합니다. 하지만 Ably 팀은 Ably가 제공하는 고유한 기능을 활용할 수 있는 브로드캐스터와 Echo 클라이언트를 권장하고 유지 관리합니다. Ably에서 유지 관리하는 드라이버 사용에 대한 자세한 내용은 Ably의 Laravel 브로드캐스터 문서를 참조하십시오.

Ably를 사용하여 이벤트를 브로드캐스트하려면 Composer 패키지 관리자를 사용하여 Ably PHP SDK를 설치해야 합니다.

composer require ably/ably-php

다음으로, config/broadcasting.php 구성 파일에서 Ably 자격 증명을 구성해야 합니다. 이 파일에는 키를 빠르게 지정할 수 있도록 Ably 구성 예제가 이미 포함되어 있습니다. 일반적으로 이 값은 ABLY_KEY 환경 변수를 통해 설정해야 합니다.

ABLY_KEY=your-ably-key

그런 다음, 애플리케이션의 .env 파일에서 BROADCAST_CONNECTION 환경 변수를 ably로 설정하십시오.

BROADCAST_CONNECTION=ably

이제 클라이언트 측에서 브로드캐스트 이벤트를 수신할 Laravel Echo를 설치하고 구성할 준비가 되었습니다.

클라이언트 측 설치

Reverb

Laravel Echo는 서버 측 브로드캐스팅 드라이버에서 브로드캐스트하는 이벤트를 채널 구독 및 수신을 간편하게 만들어주는 JavaScript 라이브러리입니다. NPM 패키지 관리자를 통해 Echo를 설치할 수 있습니다. 이 예에서는 Reverb가 WebSocket 구독, 채널 및 메시지에 Pusher 프로토콜을 사용하므로 pusher-js 패키지도 설치합니다.

npm install --save-dev laravel-echo pusher-js

Echo를 설치했으면 애플리케이션의 JavaScript에서 새 Echo 인스턴스를 생성할 준비가 되었습니다. 이를 수행하기에 좋은 위치는 Laravel 프레임워크에 포함된 resources/js/bootstrap.js 파일의 맨 아래입니다. 기본적으로 이 파일에는 Echo 구성 예제가 이미 포함되어 있습니다. 주석 처리를 해제하고 broadcaster 구성 옵션을 reverb로 업데이트하기만 하면 됩니다.

import Echo from 'laravel-echo';
 
import Pusher from 'pusher-js';
window.Pusher = Pusher;
 
window.Echo = new Echo({
broadcaster: 'reverb',
key: import.meta.env.VITE_REVERB_APP_KEY,
wsHost: import.meta.env.VITE_REVERB_HOST,
wsPort: import.meta.env.VITE_REVERB_PORT,
wssPort: import.meta.env.VITE_REVERB_PORT,
forceTLS: (import.meta.env.VITE_REVERB_SCHEME ?? 'https') === 'https',
enabledTransports: ['ws', 'wss'],
});

다음으로, 애플리케이션의 에셋을 컴파일해야 합니다.

npm run build
exclamation

Laravel Echo reverb 브로드캐스터는 laravel-echo v1.16.0 이상을 필요로 합니다.

Pusher 채널

Laravel Echo는 채널을 구독하고 서버 측 브로드캐스팅 드라이버에서 브로드캐스팅하는 이벤트를 수신하는 작업을 간편하게 해주는 JavaScript 라이브러리입니다. 또한 Echo는 WebSocket 구독, 채널 및 메시지에 대한 Pusher 프로토콜을 구현하기 위해 pusher-js NPM 패키지를 활용합니다.

install:broadcasting Artisan 명령은 laravel-echopusher-js 패키지를 자동으로 설치해 줍니다. 하지만 NPM을 통해 수동으로 이러한 패키지를 설치할 수도 있습니다:

npm install --save-dev laravel-echo pusher-js

Echo가 설치되면 애플리케이션의 JavaScript에서 새로운 Echo 인스턴스를 생성할 준비가 된 것입니다. install:broadcasting 명령은 resources/js/echo.js에 Echo 구성 파일을 생성합니다. 하지만 이 파일의 기본 구성은 Laravel Reverb용으로 되어 있습니다. 아래의 구성을 복사하여 Pusher로 구성을 전환할 수 있습니다:

import Echo from 'laravel-echo';
 
import Pusher from 'pusher-js';
window.Pusher = Pusher;
 
window.Echo = new Echo({
broadcaster: 'pusher',
key: import.meta.env.VITE_PUSHER_APP_KEY,
cluster: import.meta.env.VITE_PUSHER_APP_CLUSTER,
forceTLS: true
});

다음으로, 애플리케이션의 .env 파일에서 Pusher 환경 변수에 적절한 값을 정의해야 합니다. 이러한 변수가 .env 파일에 아직 없는 경우 추가해야 합니다:

PUSHER_APP_ID="your-pusher-app-id"
PUSHER_APP_KEY="your-pusher-key"
PUSHER_APP_SECRET="your-pusher-secret"
PUSHER_HOST=
PUSHER_PORT=443
PUSHER_SCHEME="https"
PUSHER_APP_CLUSTER="mt1"
 
VITE_APP_NAME="${APP_NAME}"
VITE_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
VITE_PUSHER_HOST="${PUSHER_HOST}"
VITE_PUSHER_PORT="${PUSHER_PORT}"
VITE_PUSHER_SCHEME="${PUSHER_SCHEME}"
VITE_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"

애플리케이션의 요구 사항에 따라 Echo 구성을 조정한 후에는 애플리케이션의 에셋을 컴파일할 수 있습니다.

npm run build
lightbulb

애플리케이션의 JavaScript 에셋 컴파일에 대한 자세한 내용은 Vite 문서를 참조하십시오.

기존 클라이언트 인스턴스 사용하기

Echo에서 사용하고자 하는 미리 구성된 Pusher Channels 클라이언트 인스턴스가 이미 있는 경우, client 구성 옵션을 통해 Echo에 전달할 수 있습니다:

import Echo from 'laravel-echo';
import Pusher from 'pusher-js';
 
const options = {
broadcaster: 'pusher',
key: 'your-pusher-channels-key'
}
 
window.Echo = new Echo({
...options,
client: new Pusher(options.key, options)
});

Ably

lightbulb

아래 문서는 "Pusher 호환 모드"에서 Ably를 사용하는 방법에 대해 설명합니다. 그러나 Ably 팀은 Ably가 제공하는 고유한 기능을 활용할 수 있는 브로드캐스터와 Echo 클라이언트를 권장하고 유지 관리합니다. Ably에서 유지 관리하는 드라이버 사용에 대한 자세한 내용은 Ably의 Laravel 브로드캐스터 문서를 참조하십시오.

Laravel Echo는 서버 측 브로드캐스팅 드라이버에서 브로드캐스트하는 채널을 구독하고 이벤트를 수신하는 작업을 쉽게 만들어주는 JavaScript 라이브러리입니다. 또한 Echo는 pusher-js NPM 패키지를 활용하여 WebSocket 구독, 채널 및 메시지에 대한 Pusher 프로토콜을 구현합니다.

install:broadcasting Artisan 명령어는 laravel-echopusher-js 패키지를 자동으로 설치합니다. 하지만 NPM을 통해 이러한 패키지를 수동으로 설치할 수도 있습니다:

npm install --save-dev laravel-echo pusher-js

계속하기 전에 Ably 애플리케이션 설정에서 Pusher 프로토콜 지원을 활성화해야 합니다. Ably 애플리케이션 설정 대시보드의 "프로토콜 어댑터 설정" 부분에서 이 기능을 활성화할 수 있습니다.

Echo가 설치되면 애플리케이션의 JavaScript에서 새로운 Echo 인스턴스를 생성할 준비가 된 것입니다. install:broadcasting 명령어는 resources/js/echo.js에 Echo 구성 파일을 생성합니다. 하지만 이 파일의 기본 구성은 Laravel Reverb용입니다. 아래 구성을 복사하여 Ably로 구성을 전환할 수 있습니다.

import Echo from 'laravel-echo';
 
import Pusher from 'pusher-js';
window.Pusher = Pusher;
 
window.Echo = new Echo({
broadcaster: 'pusher',
key: import.meta.env.VITE_ABLY_PUBLIC_KEY,
wsHost: 'realtime-pusher.ably.io',
wsPort: 443,
disableStats: true,
encrypted: true,
});

Ably Echo 구성에서 VITE_ABLY_PUBLIC_KEY 환경 변수를 참조하는 것을 알아차렸을 것입니다. 이 변수의 값은 Ably 공개 키여야 합니다. 공개 키는 Ably 키에서 : 문자 앞에 나오는 부분입니다.

필요에 따라 Echo 구성을 조정한 후 애플리케이션 자산을 컴파일할 수 있습니다.

npm run dev
lightbulb

애플리케이션의 JavaScript 에셋 컴파일에 대해 자세히 알아보려면 Vite 문서를 참조하세요.

개념 개요

라라벨의 이벤트 브로드캐스팅을 사용하면 서버 측 라라벨 이벤트를 웹소켓에 대한 드라이버 기반 접근 방식을 사용하여 클라이언트 측 JavaScript 애플리케이션으로 브로드캐스트할 수 있습니다. 현재 라라벨은 Pusher ChannelsAbly 드라이버와 함께 제공됩니다. 이벤트는 Laravel Echo JavaScript 패키지를 사용하여 클라이언트 측에서 쉽게 사용할 수 있습니다.

이벤트는 공개 또는 비공개로 지정할 수 있는 "채널"을 통해 브로드캐스트됩니다. 애플리케이션 방문자는 인증이나 권한 부여 없이 공개 채널을 구독할 수 있습니다. 그러나 비공개 채널을 구독하려면 사용자가 인증을 받고 해당 채널을 청취할 수 있는 권한이 있어야 합니다.

예제 애플리케이션 사용

이벤트 브로드캐스팅의 각 구성 요소에 대해 자세히 알아보기 전에 전자 상거래 스토어를 예로 사용하여 높은 수준의 개요를 살펴보겠습니다.

우리 애플리케이션에서 사용자가 주문의 배송 상태를 볼 수 있는 페이지가 있다고 가정해 보겠습니다. 또한 애플리케이션에서 배송 상태 업데이트가 처리될 때 OrderShipmentStatusUpdated 이벤트가 발생한다고 가정합니다.

use App\Events\OrderShipmentStatusUpdated;
 
OrderShipmentStatusUpdated::dispatch($order);

ShouldBroadcast 인터페이스

사용자가 자신의 주문 중 하나를 보고 있을 때 상태 업데이트를 보기 위해 페이지를 새로 고침할 필요가 없도록 하고 싶습니다. 대신, 업데이트가 생성되는 즉시 애플리케이션으로 브로드캐스트하고 싶습니다. 따라서 OrderShipmentStatusUpdated 이벤트를 ShouldBroadcast 인터페이스로 표시해야 합니다. 이렇게 하면 라라벨이 이벤트가 발생할 때 브로드캐스트하도록 지시합니다.

<?php
 
namespace App\Events;
 
use App\Models\Order;
use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Queue\SerializesModels;
 
class OrderShipmentStatusUpdated implements ShouldBroadcast
{
/**
* 주문 인스턴스입니다.
*
* @var \App\Models\Order
*/
public $order;
}

ShouldBroadcast 인터페이스에는 이벤트가 broadcastOn 메서드를 정의해야 합니다. 이 메서드는 이벤트가 브로드캐스트해야 하는 채널을 반환하는 역할을 합니다. 이 메서드의 빈 스텁은 이미 생성된 이벤트 클래스에 정의되어 있으므로 세부 정보만 채우면 됩니다. 주문 작성자만 상태 업데이트를 볼 수 있기를 원하므로 주문에 연결된 비공개 채널에 이벤트를 브로드캐스트합니다.

use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\PrivateChannel;
 
/**
* 이벤트가 브로드캐스트되어야 하는 채널을 가져옵니다.
*/
public function broadcastOn(): Channel
{
return new PrivateChannel('orders.'.$this->order->id);
}

이벤트를 여러 채널에서 브로드캐스트하려는 경우 대신 array를 반환할 수 있습니다.

use Illuminate\Broadcasting\PrivateChannel;
 
/**
* 이벤트가 브로드캐스트되어야 하는 채널을 가져옵니다.
*
* @return array<int, \Illuminate\Broadcasting\Channel>
*/
public function broadcastOn(): array
{
return [
new PrivateChannel('orders.'.$this->order->id),
// ...
];
}

채널 권한 부여

비공개 채널을 청취하려면 사용자가 권한을 부여받아야 합니다. 애플리케이션의 routes/channels.php 파일에서 채널 권한 부여 규칙을 정의할 수 있습니다. 이 예에서는 비공개 orders.1 채널을 청취하려는 사용자가 실제로 주문 작성자인지 확인해야 합니다.

use App\Models\Order;
use App\Models\User;
 
Broadcast::channel('orders.{orderId}', function (User $user, int $orderId) {
return $user->id === Order::findOrNew($orderId)->user_id;
});

channel 메서드는 두 개의 인수를 허용합니다. 채널 이름과 사용자가 채널을 청취할 권한이 있는지 여부를 나타내는 true 또는 false를 반환하는 콜백입니다.

모든 권한 부여 콜백은 현재 인증된 사용자를 첫 번째 인수로, 추가 와일드카드 매개변수를 후속 인수로 받습니다. 이 예에서는 채널 이름의 "ID" 부분이 와일드카드임을 나타내기 위해 {orderId} 자리 표시자를 사용하고 있습니다.

이벤트 브로드캐스트 수신

다음으로 남은 것은 JavaScript 애플리케이션에서 이벤트를 수신하는 것입니다. Laravel Echo를 사용하여 이 작업을 수행할 수 있습니다. 먼저 private 메서드를 사용하여 비공개 채널을 구독합니다. 그런 다음, listen 메서드를 사용하여 OrderShipmentStatusUpdated 이벤트를 수신할 수 있습니다. 기본적으로 이벤트의 모든 공개 속성은 브로드캐스트 이벤트에 포함됩니다.

Echo.private(`orders.${orderId}`)
.listen('OrderShipmentStatusUpdated', (e) => {
// 주문 배송 상태가 업데이트되면 콘솔에 주문 정보를 출력합니다.
console.log(e.order);
});

브로드캐스트 이벤트 정의

주어진 이벤트를 브로드캐스트해야 함을 Laravel에 알리려면 이벤트 클래스에 Illuminate\Contracts\Broadcasting\ShouldBroadcast 인터페이스를 구현해야 합니다. 이 인터페이스는 프레임워크에서 생성된 모든 이벤트 클래스에 이미 임포트되어 있으므로 이벤트에 쉽게 추가할 수 있습니다.

ShouldBroadcast 인터페이스는 broadcastOn이라는 단일 메서드를 구현해야 합니다. broadcastOn 메서드는 이벤트가 브로드캐스트될 채널 또는 채널 배열을 반환해야 합니다. 채널은 Channel, PrivateChannel 또는 PresenceChannel의 인스턴스여야 합니다. Channel 인스턴스는 모든 사용자가 구독할 수 있는 공개 채널을 나타내고, PrivateChannelPresenceChannel채널 인증이 필요한 개인 채널을 나타냅니다.

<?php
 
namespace App\Events;
 
use App\Models\User;
use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Queue\SerializesModels;
 
class ServerCreated implements ShouldBroadcast
{
use SerializesModels;
 
/**
* 새 이벤트 인스턴스를 생성합니다.
*/
public function __construct(
public User $user,
) {}
 
/**
* 이벤트가 브로드캐스트되어야 하는 채널을 가져옵니다.
*
* @return array<int, \Illuminate\Broadcasting\Channel>
*/
public function broadcastOn(): array
{
return [
new PrivateChannel('user.'.$this->user->id),
];
}
}

ShouldBroadcast 인터페이스를 구현한 후에는 평소처럼 이벤트를 실행하기만 하면 됩니다. 이벤트가 실행되면 큐 작업이 지정된 브로드캐스트 드라이버를 사용하여 이벤트를 자동으로 브로드캐스트합니다.

브로드캐스트 이름

기본적으로 Laravel은 이벤트의 클래스 이름을 사용하여 이벤트를 브로드캐스트합니다. 그러나 이벤트에서 broadcastAs 메서드를 정의하여 브로드캐스트 이름을 사용자 지정할 수 있습니다.

/**
* 이벤트의 브로드캐스트 이름입니다.
*/
public function broadcastAs(): string
{
return 'server.created';
}

broadcastAs 메서드를 사용하여 브로드캐스트 이름을 사용자 지정하는 경우 리스너를 . 문자로 시작하여 등록해야 합니다. 이렇게 하면 Echo가 애플리케이션의 네임스페이스를 이벤트에 추가하지 않도록 지시합니다.

.listen('.server.created', function (e) {
....
});

브로드캐스트 데이터

이벤트가 브로드캐스트되면 모든 public 속성이 자동으로 직렬화되어 이벤트의 페이로드로 브로드캐스트되므로 JavaScript 애플리케이션에서 공용 데이터에 액세스할 수 있습니다. 예를 들어 이벤트에 Eloquent 모델을 포함하는 단일 공용 $user 속성이 있는 경우 이벤트의 브로드캐스트 페이로드는 다음과 같습니다.

{
"user": {
"id": 1,
"name": "Patrick Stewart"
...
}
}

하지만 브로드캐스트 페이로드에 대해 더 세밀한 제어를 하고 싶다면 이벤트에 broadcastWith 메서드를 추가할 수 있습니다. 이 메서드는 이벤트 페이로드로 브로드캐스트하려는 데이터의 배열을 반환해야 합니다.

/**
* 브로드캐스트할 데이터를 가져옵니다.
*
* @return array<string, mixed>
*/
public function broadcastWith(): array
{
return ['id' => $this->user->id];
}

브로드캐스트 큐

기본적으로 각 브로드캐스트 이벤트는 queue.php 구성 파일에 지정된 기본 큐 연결에 대한 기본 큐에 배치됩니다. 이벤트 클래스에 connectionqueue 속성을 정의하여 브로드캐스터에서 사용하는 큐 연결 및 이름을 사용자 지정할 수 있습니다.

/**
* 이벤트를 브로드캐스트할 때 사용할 큐 연결의 이름입니다.
*
* @var string
*/
public $connection = 'redis';
 
/**
* 브로드캐스트 작업을 배치할 큐의 이름입니다.
*
* @var string
*/
public $queue = 'default';

또는 이벤트에 broadcastQueue 메서드를 정의하여 큐 이름을 사용자 지정할 수 있습니다.

/**
* 브로드캐스트 작업을 배치할 큐의 이름입니다.
*/
public function broadcastQueue(): string
{
return 'default';
}

기본 큐 드라이버 대신 sync 큐를 사용하여 이벤트를 브로드캐스트하려면 ShouldBroadcast 대신 ShouldBroadcastNow 인터페이스를 구현할 수 있습니다.

<?php
 
use Illuminate\Contracts\Broadcasting\ShouldBroadcastNow;
 
class OrderShipmentStatusUpdated implements ShouldBroadcastNow
{
// ...
}

브로드캐스트 조건

경우에 따라 주어진 조건이 참인 경우에만 이벤트를 브로드캐스트하고 싶을 수 있습니다. 이벤트 클래스에 broadcastWhen 메서드를 추가하여 이러한 조건을 정의할 수 있습니다.

/**
* 이 이벤트를 브로드캐스트해야 하는지 여부를 결정합니다.
*/
public function broadcastWhen(): bool
{
return $this->order->value > 100;
}

브로드캐스트 및 데이터베이스 트랜잭션

데이터베이스 트랜잭션 내에서 브로드캐스트 이벤트가 디스패치되면 데이터베이스 트랜잭션이 커밋되기 전에 큐에서 처리될 수 있습니다. 이 경우 데이터베이스 트랜잭션 중에 모델 또는 데이터베이스 레코드에 적용한 모든 업데이트가 데이터베이스에 아직 반영되지 않을 수 있습니다. 또한 트랜잭션 내에서 생성된 모든 모델 또는 데이터베이스 레코드가 데이터베이스에 존재하지 않을 수 있습니다. 이벤트가 이러한 모델에 의존하는 경우 이벤트를 브로드캐스트하는 작업이 처리될 때 예기치 않은 오류가 발생할 수 있습니다.

큐 연결의 after_commit 구성 옵션이 false로 설정된 경우에도 이벤트 클래스에 ShouldDispatchAfterCommit 인터페이스를 구현하여 열린 모든 데이터베이스 트랜잭션이 커밋된 후에 특정 브로드캐스트 이벤트를 디스패치해야 함을 표시할 수 있습니다.

<?php
 
namespace App\Events;
 
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Contracts\Events\ShouldDispatchAfterCommit;
use Illuminate\Queue\SerializesModels;
 
class ServerCreated implements ShouldBroadcast, ShouldDispatchAfterCommit
{
use SerializesModels;
}
lightbulb

이러한 문제를 해결하는 방법에 대한 자세한 내용은 큐 작업 및 데이터베이스 트랜잭션에 대한 문서를 참조하십시오.

채널 권한 부여

개인 채널에서는 현재 인증된 사용자가 실제로 채널을 수신할 수 있는지 권한을 부여해야 합니다. 이는 채널 이름과 함께 Laravel 애플리케이션에 HTTP 요청을 보내고 애플리케이션에서 사용자가 해당 채널을 수신할 수 있는지 여부를 결정하도록 허용함으로써 수행됩니다. Laravel Echo를 사용하는 경우 개인 채널 구독을 승인하기 위한 HTTP 요청이 자동으로 수행됩니다.

브로드캐스팅이 활성화되면 Laravel은 권한 부여 요청을 처리하기 위해 /broadcasting/auth 경로를 자동으로 등록합니다. /broadcasting/auth 경로는 web 미들웨어 그룹 내에 자동으로 배치됩니다.

권한 부여 콜백 정의

다음으로, 현재 인증된 사용자가 주어진 채널을 수신할 수 있는지 여부를 실제로 결정하는 로직을 정의해야 합니다. 이는 install:broadcasting Artisan 명령으로 생성된 routes/channels.php 파일에서 수행됩니다. 이 파일에서 Broadcast::channel 메서드를 사용하여 채널 권한 부여 콜백을 등록할 수 있습니다.

use App\Models\User;
 
Broadcast::channel('orders.{orderId}', function (User $user, int $orderId) {
return $user->id === Order::findOrNew($orderId)->user_id;
});

channel 메서드는 두 가지 인수를 허용합니다. 채널의 이름과 사용자가 채널을 수신할 권한이 있는지 여부를 나타내는 true 또는 false를 반환하는 콜백입니다.

모든 권한 부여 콜백은 현재 인증된 사용자를 첫 번째 인수로 받고 추가 와일드카드 매개변수를 후속 인수로 받습니다. 이 예에서는 {orderId} 자리 표시자를 사용하여 채널 이름의 "ID" 부분이 와일드카드임을 나타냅니다.

channel:list Artisan 명령을 사용하여 애플리케이션의 브로드캐스트 권한 부여 콜백 목록을 볼 수 있습니다.

php artisan channel:list

인증 콜백 모델 바인딩

HTTP 라우트와 마찬가지로, 채널 라우트 역시 암시적 및 명시적 라우트 모델 바인딩을 활용할 수 있습니다. 예를 들어, 문자열 또는 숫자 주문 ID를 받는 대신 실제 Order 모델 인스턴스를 요청할 수 있습니다:

use App\Models\Order;
use App\Models\User;
 
Broadcast::channel('orders.{order}', function (User $user, Order $order) {
return $user->id === $order->user_id;
});
exclamation

HTTP 라우트 모델 바인딩과 달리, 채널 모델 바인딩은 자동 암시적 모델 바인딩 스코핑을 지원하지 않습니다. 하지만 대부분의 채널은 단일 모델의 고유한 기본 키를 기반으로 스코핑될 수 있기 때문에 이것은 드문 문제입니다.

인증 콜백 인증

비공개 및 프레즌스 브로드캐스트 채널은 애플리케이션의 기본 인증 가드를 통해 현재 사용자를 인증합니다. 사용자가 인증되지 않은 경우, 채널 인증이 자동으로 거부되고 인증 콜백이 실행되지 않습니다. 하지만 필요한 경우 들어오는 요청을 인증해야 하는 여러 개의 사용자 정의 가드를 할당할 수 있습니다:

Broadcast::channel('channel', function () {
// ...
}, ['guards' => ['web', 'admin']]);

채널 클래스 정의

애플리케이션에서 많은 다른 채널을 사용하는 경우, routes/channels.php 파일이 부피가 커질 수 있습니다. 따라서 채널을 인증하기 위해 클로저를 사용하는 대신 채널 클래스를 사용할 수 있습니다. 채널 클래스를 생성하려면 make:channel Artisan 명령어를 사용하십시오. 이 명령어는 App/Broadcasting 디렉토리에 새 채널 클래스를 배치합니다.

php artisan make:channel OrderChannel

다음으로, routes/channels.php 파일에 채널을 등록하십시오:

use App\Broadcasting\OrderChannel;
 
Broadcast::channel('orders.{order}', OrderChannel::class);

마지막으로, 채널 클래스의 join 메서드에 채널에 대한 인증 로직을 배치할 수 있습니다. 이 join 메서드는 일반적으로 채널 인증 클로저에 배치했을 로직과 동일한 로직을 포함합니다. 채널 모델 바인딩을 활용할 수도 있습니다.

<?php
 
namespace App\Broadcasting;
 
use App\Models\Order;
use App\Models\User;
 
class OrderChannel
{
/**
* 새로운 채널 인스턴스를 생성합니다.
*/
public function __construct() {}
 
/**
* 채널에 대한 사용자의 액세스를 인증합니다.
*/
public function join(User $user, Order $order): array|bool
{
return $user->id === $order->user_id;
}
}
lightbulb

라라벨의 다른 많은 클래스와 마찬가지로 채널 클래스는 서비스 컨테이너에 의해 자동으로 확인됩니다. 따라서 채널의 생성자에 필요한 모든 종속성을 타입 힌트로 지정할 수 있습니다.

이벤트 브로드캐스팅

이벤트를 정의하고 ShouldBroadcast 인터페이스로 표시했다면, 이벤트의 dispatch 메서드를 사용하여 이벤트를 발생시키기만 하면 됩니다. 이벤트 디스패처는 이벤트가 ShouldBroadcast 인터페이스로 표시된 것을 인식하고 브로드캐스팅을 위해 이벤트를 큐에 넣습니다.

use App\Events\OrderShipmentStatusUpdated;
 
OrderShipmentStatusUpdated::dispatch($order);

다른 사용자에게만

이벤트 브로드캐스팅을 활용하는 애플리케이션을 구축할 때, 때때로 현재 사용자를 제외한 특정 채널의 모든 구독자에게 이벤트를 브로드캐스트해야 할 수 있습니다. broadcast 헬퍼와 toOthers 메서드를 사용하여 이를 달성할 수 있습니다.

use App\Events\OrderShipmentStatusUpdated;
 
broadcast(new OrderShipmentStatusUpdated($update))->toOthers();

toOthers 메서드를 언제 사용해야 하는지 더 잘 이해하기 위해 사용자가 작업 이름을 입력하여 새 작업을 생성할 수 있는 작업 목록 애플리케이션을 상상해 보겠습니다. 작업을 생성하기 위해 애플리케이션은 작업 생성을 브로드캐스트하고 새 작업의 JSON 표현을 반환하는 /task URL에 요청을 보낼 수 있습니다. JavaScript 애플리케이션이 엔드포인트에서 응답을 받으면 다음과 같이 새 작업을 작업 목록에 직접 삽입할 수 있습니다.

axios.post('/task', task)
.then((response) => {
this.tasks.push(response.data);
});

하지만, 작업 생성도 브로드캐스트한다는 것을 기억하세요. 만약 여러분의 JavaScript 애플리케이션이 작업 목록에 작업을 추가하기 위해 이 이벤트를 수신하고 있다면, 목록에 중복된 작업이 생길 것입니다. 하나는 엔드포인트에서, 다른 하나는 브로드캐스트에서 온 작업일 것입니다. toOthers 메서드를 사용하여 브로드캐스터가 현재 사용자에게 이벤트를 브로드캐스트하지 않도록 지시함으로써 이 문제를 해결할 수 있습니다.

exclamation

toOthers 메서드를 호출하려면 이벤트가 Illuminate\Broadcasting\InteractsWithSockets 트레이트를 사용해야 합니다.

구성

Laravel Echo 인스턴스를 초기화하면 소켓 ID가 연결에 할당됩니다. JavaScript 애플리케이션에서 HTTP 요청을 보내기 위해 전역 Axios 인스턴스를 사용하고 있다면, 소켓 ID는 자동으로 모든 발신 요청에 X-Socket-ID 헤더로 첨부됩니다. 그런 다음 toOthers 메서드를 호출하면 Laravel은 헤더에서 소켓 ID를 추출하여 해당 소켓 ID를 가진 연결에는 브로드캐스트하지 않도록 브로드캐스터에 지시합니다.

전역 Axios 인스턴스를 사용하지 않는 경우, JavaScript 애플리케이션에서 모든 발신 요청과 함께 X-Socket-ID 헤더를 보내도록 수동으로 구성해야 합니다. Echo.socketId 메서드를 사용하여 소켓 ID를 검색할 수 있습니다:

var socketId = Echo.socketId();

연결 사용자 정의하기

애플리케이션이 여러 브로드캐스트 연결과 상호 작용하고 기본값이 아닌 브로드캐스터를 사용하여 이벤트를 브로드캐스트하려는 경우, via 메서드를 사용하여 이벤트를 푸시할 연결을 지정할 수 있습니다.

use App\Events\OrderShipmentStatusUpdated;
 
broadcast(new OrderShipmentStatusUpdated($update))->via('pusher');

또는 이벤트 생성자 내에서 broadcastVia 메서드를 호출하여 이벤트의 브로드캐스트 연결을 지정할 수 있습니다. 그러나 그렇게 하기 전에 이벤트 클래스가 InteractsWithBroadcasting 트레이트를 사용하는지 확인해야 합니다.

<?php
 
namespace App\Events;
 
use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithBroadcasting;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Queue\SerializesModels;
 
class OrderShipmentStatusUpdated implements ShouldBroadcast
{
use InteractsWithBroadcasting;
 
/**
* 새로운 이벤트 인스턴스를 생성합니다.
*/
public function __construct()
{
$this->broadcastVia('pusher');
}
}

익명 이벤트

경우에 따라 전용 이벤트 클래스를 만들지 않고도 애플리케이션의 프런트엔드로 간단한 이벤트를 브로드캐스트하고 싶을 수 있습니다. 이를 위해 Broadcast 파사드는 "익명 이벤트"를 브로드캐스트할 수 있도록 합니다.

Broadcast::on('orders.'.$order->id)->send();

위의 예시는 다음 이벤트를 브로드캐스트합니다.

{
"event": "AnonymousEvent",
"data": "[]",
"channel": "orders.1"
}

aswith 메서드를 사용하여 이벤트의 이름과 데이터를 사용자 정의할 수 있습니다.

Broadcast::on('orders.'.$order->id)
->as('OrderPlaced')
->with($order)
->send();

위 예시는 다음과 같은 이벤트를 브로드캐스트합니다:

{
"event": "OrderPlaced",
"data": "{ id: 1, total: 100 }",
"channel": "orders.1"
}

익명 이벤트를 개인 채널 또는 프레즌스 채널로 브로드캐스트하려면 privatepresence 메서드를 사용할 수 있습니다:

Broadcast::private('orders.'.$order->id)->send();
Broadcast::presence('channels.'.$channel->id)->send();

send 메서드를 사용하여 익명 이벤트를 브로드캐스트하면 해당 이벤트는 처리를 위해 애플리케이션의 로 전달됩니다. 그러나 이벤트를 즉시 브로드캐스트하려면 sendNow 메서드를 사용할 수 있습니다:

Broadcast::on('orders.'.$order->id)->sendNow();

현재 인증된 사용자를 제외한 모든 채널 구독자에게 이벤트를 브로드캐스트하려면 toOthers 메서드를 호출하면 됩니다:

Broadcast::on('orders.'.$order->id)
->toOthers()
->send();

브로드캐스트 수신

이벤트 수신 대기

Laravel Echo를 설치하고 인스턴스화했다면 Laravel 애플리케이션에서 브로드캐스트되는 이벤트를 수신 대기할 준비가 된 것입니다. 먼저, channel 메서드를 사용하여 채널 인스턴스를 검색한 다음, listen 메서드를 호출하여 지정된 이벤트를 수신 대기합니다:

Echo.channel(`orders.${this.order.id}`)
.listen('OrderShipmentStatusUpdated', (e) => {
console.log(e.order.name);
});

개인 채널에서 이벤트를 수신 대기하려면 대신 private 메서드를 사용하십시오. listen 메서드에 대한 호출을 계속 연결하여 단일 채널에서 여러 이벤트를 수신 대기할 수 있습니다:

Echo.private(`orders.${this.order.id}`)
.listen(/* ... */)
.listen(/* ... */)
.listen(/* ... */);

이벤트 수신 중단

채널을 떠나지 않고 특정 이벤트 수신을 중단하려면 stopListening 메서드를 사용할 수 있습니다.

Echo.private(`orders.${this.order.id}`)
.stopListening('OrderShipmentStatusUpdated')

채널 떠나기

채널을 떠나려면 Echo 인스턴스에서 leaveChannel 메서드를 호출하면 됩니다.

Echo.leaveChannel(`orders.${this.order.id}`);

채널과 연결된 개인 채널 및 존재 채널을 모두 떠나려면 leave 메서드를 호출하면 됩니다.

Echo.leave(`orders.${this.order.id}`);

네임스페이스

위 예제에서 이벤트 클래스에 대한 전체 App\Events 네임스페이스를 지정하지 않았다는 것을 눈치채셨을 것입니다. 이는 Echo가 이벤트가 App\Events 네임스페이스에 있다고 자동적으로 가정하기 때문입니다. 하지만 namespace 구성 옵션을 전달하여 Echo를 인스턴스화할 때 루트 네임스페이스를 구성할 수 있습니다.

window.Echo = new Echo({
broadcaster: 'pusher',
// ...
namespace: 'App.Other.Namespace'
});

또는 Echo를 사용하여 이벤트 클래스를 구독할 때 이벤트 클래스 앞에 .을 붙일 수도 있습니다. 이렇게 하면 항상 정규화된 클래스 이름을 지정할 수 있습니다.

Echo.channel('orders')
.listen('.Namespace\\Event\\Class', (e) => {
// ...
});

프레즌스 채널

프레즌스 채널은 개인 채널의 보안을 기반으로 하면서 채널을 구독한 사용자를 인지하는 추가 기능을 제공합니다. 이를 통해 사용자가 동일한 페이지를 보고 있을 때 알리거나 채팅방 거주자를 나열하는 등 강력하고 협업적인 애플리케이션 기능을 쉽게 구축할 수 있습니다.

프레즌스 채널 권한 부여

모든 프레즌스 채널은 개인 채널이기도 합니다. 따라서 사용자는 액세스 권한을 부여받아야 합니다. 그러나 프레즌스 채널에 대한 권한 부여 콜백을 정의할 때 사용자가 채널에 가입할 권한이 있는 경우 true를 반환하지 않습니다. 대신 사용자 데이터 배열을 반환해야 합니다.

권한 부여 콜백에서 반환된 데이터는 JavaScript 애플리케이션의 프레즌스 채널 이벤트 리스너에서 사용할 수 있습니다. 사용자가 프레즌스 채널에 가입할 권한이 없는 경우 false 또는 null을 반환해야 합니다.

use App\Models\User;
 
Broadcast::channel('chat.{roomId}', function (User $user, int $roomId) {
if ($user->canJoinRoom($roomId)) {
return ['id' => $user->id, 'name' => $user->name];
}
});

프레즌스 채널 가입

프레즌스 채널에 가입하려면 Echo의 join 메서드를 사용할 수 있습니다. join 메서드는 listen 메서드를 노출하는 것과 함께 here, joining, leaving 이벤트를 구독할 수 있는 PresenceChannel 구현을 반환합니다.

Echo.join(`chat.${roomId}`)
.here((users) => {
// ...
})
.joining((user) => {
console.log(user.name);
})
.leaving((user) => {
console.log(user.name);
})
.error((error) => {
console.error(error);
});

here 콜백은 채널에 성공적으로 연결되면 즉시 실행되며, 현재 채널을 구독하고 있는 다른 모든 사용자의 정보가 담긴 배열을 받습니다. joining 메서드는 새로운 사용자가 채널에 연결될 때 실행되고, leaving 메서드는 사용자가 채널을 떠날 때 실행됩니다. error 메서드는 인증 엔드포인트가 200 이외의 HTTP 상태 코드를 반환하거나 반환된 JSON을 파싱하는 데 문제가 있는 경우 실행됩니다.

Presence 채널로 브로드캐스팅

Presence 채널은 public 또는 private 채널과 마찬가지로 이벤트를 수신할 수 있습니다. 채팅방 예제를 사용하여 NewMessage 이벤트를 방의 presence 채널로 브로드캐스팅할 수 있습니다. 이렇게 하려면 이벤트의 broadcastOn 메서드에서 PresenceChannel 인스턴스를 반환합니다.

/**
* 이벤트가 브로드캐스팅되어야 하는 채널을 가져옵니다.
*
* @return array<int, \Illuminate\Broadcasting\Channel>
*/
public function broadcastOn(): array
{
return [
new PresenceChannel('chat.'.$this->message->room_id),
];
}

다른 이벤트와 마찬가지로 broadcast 헬퍼와 toOthers 메서드를 사용하여 현재 사용자가 브로드캐스트를 수신하지 않도록 제외할 수 있습니다.

broadcast(new NewMessage($message));
 
broadcast(new NewMessage($message))->toOthers();

다른 유형의 이벤트와 마찬가지로 Echo의 listen 메서드를 사용하여 presence 채널로 전송된 이벤트를 수신할 수 있습니다.

Echo.join(`chat.${roomId}`)
.here(/* ... */)
.joining(/* ... */)
.leaving(/* ... */)
.listen('NewMessage', (e) => {
// ...
});

모델 브로드캐스팅

exclamation

모델 브로드캐스팅에 대한 다음 문서를 읽기 전에, Laravel의 모델 브로드캐스팅 서비스에 대한 일반적인 개념과 브로드캐스트 이벤트를 수동으로 생성하고 수신하는 방법에 익숙해지는 것을 권장합니다.

애플리케이션의 Eloquent 모델이 생성, 업데이트 또는 삭제될 때 이벤트를 브로드캐스트하는 것이 일반적입니다. 물론, Eloquent 모델 상태 변경에 대한 사용자 정의 이벤트를 정의하고 해당 이벤트를 ShouldBroadcast 인터페이스로 표시하여 이를 쉽게 수행할 수 있습니다.

그러나 애플리케이션에서 이러한 이벤트를 다른 목적으로 사용하지 않는 경우, 브로드캐스팅만을 목적으로 이벤트 클래스를 만드는 것이 번거로울 수 있습니다. 이를 해결하기 위해 Laravel은 Eloquent 모델이 상태 변경을 자동으로 브로드캐스트하도록 지정할 수 있습니다.

시작하려면, Eloquent 모델이 Illuminate\Database\Eloquent\BroadcastsEvents 트레이트를 사용해야 합니다. 또한 모델은 모델의 이벤트가 브로드캐스트되어야 하는 채널 배열을 반환하는 broadcastOn 메서드를 정의해야 합니다:

<?php
 
namespace App\Models;
 
use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Database\Eloquent\BroadcastsEvents;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
 
class Post extends Model
{
use BroadcastsEvents, HasFactory;
 
/**
* 게시물이 속한 사용자를 가져옵니다.
*/
public function user(): BelongsTo
{
return $this->belongsTo(User::class);
}
 
/**
* 모델 이벤트가 브로드캐스트될 채널을 가져옵니다.
*
* @return array<int, \Illuminate\Broadcasting\Channel|\Illuminate\Database\Eloquent\Model>
*/
public function broadcastOn(string $event): array
{
return [$this, $this->user];
}
}

모델이 이 트레이트를 포함하고 브로드캐스트 채널을 정의하면, 모델 인스턴스가 생성, 업데이트, 삭제, 휴지통으로 이동 또는 복원될 때 자동으로 이벤트 브로드캐스팅을 시작합니다.

또한, broadcastOn 메서드가 문자열 $event 인수를 받는 것을 눈치채셨을 것입니다. 이 인수는 모델에서 발생한 이벤트 유형을 포함하며 created, updated, deleted, trashed 또는 restored 값을 가집니다. 이 변수의 값을 검사하여 특정 이벤트에 대해 모델이 브로드캐스트해야 할 채널 (있는 경우) 을 결정할 수 있습니다.

/**
* 모델 이벤트가 브로드캐스트될 채널을 가져옵니다.
*
* @return array<string, array<int, \Illuminate\Broadcasting\Channel|\Illuminate\Database\Eloquent\Model>>
*/
public function broadcastOn(string $event): array
{
return match ($event) {
'deleted' => [],
default => [$this, $this->user],
};
}

모델 브로드캐스팅 이벤트 생성 사용자 정의

경우에 따라 Laravel이 기본 모델 브로드캐스팅 이벤트를 생성하는 방식을 사용자 정의하고 싶을 수 있습니다. Eloquent 모델에 newBroadcastableEvent 메서드를 정의하여 이를 수행할 수 있습니다. 이 메서드는 Illuminate\Database\Eloquent\BroadcastableModelEventOccurred 인스턴스를 반환해야 합니다.

use Illuminate\Database\Eloquent\BroadcastableModelEventOccurred;
 
/**
* 모델에 대한 새로운 브로드캐스팅 가능한 모델 이벤트를 생성합니다.
*/
protected function newBroadcastableEvent(string $event): BroadcastableModelEventOccurred
{
return (new BroadcastableModelEventOccurred(
$this, $event
))->dontBroadcastToCurrentUser();
}

모델 브로드캐스팅 규칙

채널 규칙

위의 모델 예제에서 broadcastOn 메서드가 Channel 인스턴스를 반환하지 않았다는 것을 눈치챘을 것입니다. 대신 Eloquent 모델이 직접 반환되었습니다. Eloquent 모델 인스턴스가 모델의 broadcastOn 메서드에 의해 반환되거나 메서드에 의해 반환된 배열에 포함된 경우, Laravel은 모델의 클래스 이름과 기본 키 식별자를 채널 이름으로 사용하여 모델에 대한 개인 채널 인스턴스를 자동으로 인스턴스화합니다.

따라서 id1App\Models\User 모델은 App.Models.User.1이라는 이름을 가진 Illuminate\Broadcasting\PrivateChannel 인스턴스로 변환됩니다. 물론 모델의 broadcastOn 메서드에서 Eloquent 모델 인스턴스를 반환하는 것 외에도 모델의 채널 이름을 완벽하게 제어하기 위해 전체 Channel 인스턴스를 반환할 수도 있습니다.

use Illuminate\Broadcasting\PrivateChannel;
 
/**
* 모델 이벤트가 브로드캐스트되어야 하는 채널을 가져옵니다.
*
* @return array<int, \Illuminate\Broadcasting\Channel>
*/
public function broadcastOn(string $event): array
{
return [
new PrivateChannel('user.'.$this->id)
];
}

모델의 broadcastOn 메서드에서 명시적으로 채널 인스턴스를 반환하려는 경우, Eloquent 모델 인스턴스를 채널의 생성자에 전달할 수 있습니다. 이렇게 하면 Laravel은 위에서 설명한 모델 채널 규칙을 사용하여 Eloquent 모델을 채널 이름 문자열로 변환합니다.

return [new Channel($this->user)];

모델의 채널 이름을 확인해야 하는 경우, 모든 모델 인스턴스에서 broadcastChannel 메서드를 호출할 수 있습니다. 예를 들어, 이 메서드는 id1App\Models\User 모델에 대해 App.Models.User.1 문자열을 반환합니다.

$user->broadcastChannel()

이벤트 규칙

모델 브로드캐스트 이벤트는 애플리케이션의 App\Events 디렉토리 내의 "실제" 이벤트와 연결되어 있지 않으므로, 규칙에 따라 이름과 페이로드가 할당됩니다. Laravel의 규칙은 모델의 클래스 이름(네임스페이스 제외)과 브로드캐스트를 트리거한 모델 이벤트의 이름을 사용하여 이벤트를 클라이언트 측 애플리케이션에 브로드캐스트하는 것입니다.

따라서, 예를 들어 App\Models\Post 모델에 대한 업데이트는 다음 페이로드와 함께 PostUpdated라는 이벤트로 클라이언트 측 애플리케이션에 브로드캐스트됩니다.

{
"model": {
"id": 1,
"title": "My first post"
...
},
...
"socket": "someSocketId",
}

App\Models\User 모델을 삭제하면 UserDeleted라는 이름의 이벤트가 브로드캐스트됩니다.

원하는 경우 모델에 broadcastAsbroadcastWith 메서드를 추가하여 사용자 지정 브로드캐스트 이름과 페이로드를 정의할 수 있습니다. 이러한 메서드는 발생하는 모델 이벤트/작업의 이름을 받으므로 각 모델 작업에 대한 이벤트 이름과 페이로드를 사용자 정의할 수 있습니다. broadcastAs 메서드에서 null이 반환되면 Laravel은 이벤트를 브로드캐스트할 때 위에서 설명한 모델 브로드캐스팅 이벤트 이름 규칙을 사용합니다.

/**
* 모델 이벤트의 브로드캐스트 이름입니다.
*/
public function broadcastAs(string $event): string|null
{
return match ($event) {
'created' => 'post.created',
default => null,
};
}
 
/**
* 모델에 대해 브로드캐스트할 데이터를 가져옵니다.
*
* @return array<string, mixed>
*/
public function broadcastWith(string $event): array
{
return match ($event) {
'created' => ['title' => $this->title],
default => ['model' => $this],
};
}

모델 브로드캐스트 수신

모델에 BroadcastsEvents 트레이트를 추가하고 모델의 broadcastOn 메서드를 정의했다면, 클라이언트 측 애플리케이션 내에서 브로드캐스트된 모델 이벤트를 수신할 준비가 된 것입니다. 시작하기 전에 이벤트 수신에 대한 전체 문서를 참조하는 것이 좋습니다.

먼저 private 메서드를 사용하여 채널 인스턴스를 검색한 다음, listen 메서드를 호출하여 지정된 이벤트를 수신합니다. 일반적으로 private 메서드에 제공되는 채널 이름은 Laravel의 모델 브로드캐스팅 규칙에 해당해야 합니다.

채널 인스턴스를 얻은 후에는 listen 메서드를 사용하여 특정 이벤트를 수신할 수 있습니다. 모델 브로드캐스트 이벤트는 애플리케이션의 App\Events 디렉토리 내의 "실제" 이벤트와 연결되어 있지 않으므로, 이벤트 이름에는 특정 네임스페이스에 속하지 않음을 나타내기 위해 . 접두사를 붙여야 합니다. 각 모델 브로드캐스트 이벤트에는 모델의 모든 브로드캐스트 가능한 속성을 포함하는 model 속성이 있습니다.

Echo.private(`App.Models.User.${this.user.id}`)
.listen('.PostUpdated', (e) => {
console.log(e.model);
});

클라이언트 이벤트

lightbulb

Pusher Channels를 사용하는 경우 클라이언트 이벤트를 보내려면 애플리케이션 대시보드의 "앱 설정" 섹션에서 "클라이언트 이벤트" 옵션을 활성화해야 합니다.

때로는 Laravel 애플리케이션에 접속하지 않고 다른 연결된 클라이언트에 이벤트를 브로드캐스트하고 싶을 수 있습니다. 이는 특정 화면에서 다른 사용자가 메시지를 입력하고 있다는 것을 애플리케이션 사용자에게 알리려는 "입력 중" 알림과 같은 경우에 특히 유용할 수 있습니다.

클라이언트 이벤트를 브로드캐스트하려면 Echo의 whisper 메서드를 사용할 수 있습니다.

Echo.private(`chat.${roomId}`)
.whisper('typing', {
name: this.user.name
});

클라이언트 이벤트를 수신하려면 listenForWhisper 메서드를 사용할 수 있습니다.

Echo.private(`chat.${roomId}`)
.listenForWhisper('typing', (e) => {
console.log(e.name);
});

알림

이벤트 브로드캐스팅을 알림과 함께 사용하면 JavaScript 애플리케이션이 페이지를 새로 고칠 필요 없이 새로운 알림을 받을 수 있습니다. 시작하기 전에 브로드캐스트 알림 채널 사용에 대한 문서를 읽어보십시오.

알림이 브로드캐스트 채널을 사용하도록 구성되면 Echo의 notification 메서드를 사용하여 브로드캐스트 이벤트를 수신할 수 있습니다. 채널 이름은 알림을 받는 엔티티의 클래스 이름과 일치해야 합니다.

Echo.private(`App.Models.User.${userId}`)
.notification((notification) => {
console.log(notification.type);
});

이 예에서 broadcast 채널을 통해 App\Models\User 인스턴스로 전송된 모든 알림은 콜백에서 수신됩니다. App.Models.User.{id} 채널에 대한 채널 권한 부여 콜백은 애플리케이션의 routes/channels.php 파일에 포함되어 있습니다.