알림
소개
Laravel은 이메일 전송 지원 외에도 이메일, SMS (Vonage (이전 명칭: Nexmo)를 통해), 그리고 Slack을 포함한 다양한 전달 채널을 통해 알림을 전송하는 기능을 제공합니다. 또한, 수십 가지의 다양한 채널을 통해 알림을 전송하기 위해 다양한 커뮤니티에서 빌드한 알림 채널이 생성되었습니다! 또한 알림은 웹 인터페이스에 표시할 수 있도록 데이터베이스에 저장할 수도 있습니다.
일반적으로 알림은 애플리케이션에서 발생한 어떤 사건을 사용자에게 알리는 짧고 유익한 메시지여야 합니다. 예를 들어, 청구 애플리케이션을 작성하는 경우 이메일 및 SMS 채널을 통해 사용자에게 "청구서 결제 완료" 알림을 보낼 수 있습니다.
알림 생성
Laravel에서 각 알림은 일반적으로 app/Notifications 디렉토리에 저장되는 단일 클래스로 표현됩니다. 애플리케이션에 이 디렉토리가 없더라도 걱정하지 마세요. make:notification Artisan 명령을 실행하면 자동으로 생성됩니다.
php artisan make:notification InvoicePaid
이 명령은 app/Notifications 디렉토리에 새로운 알림 클래스를 배치합니다. 각 알림 클래스는 via 메서드와 toMail 또는 toDatabase와 같이 특정 채널에 맞게 조정된 메시지로 알림을 변환하는 가변적인 수의 메시지 빌딩 메서드를 포함합니다.
알림 보내기
Notifiable 트레이트 사용
알림은 두 가지 방법으로 보낼 수 있습니다. Notifiable 트레이트의 notify 메서드를 사용하거나 Notification 파사드를 사용하는 것입니다. Notifiable 트레이트는 기본적으로 애플리케이션의 App\Models\User 모델에 포함되어 있습니다.
<?php namespace App\Models; use Illuminate\Foundation\Auth\User as Authenticatable;use Illuminate\Notifications\Notifiable; class User extends Authenticatable{ use Notifiable;}
이 트레이트에서 제공하는 notify 메서드는 알림 인스턴스를 받도록 기대합니다.
use App\Notifications\InvoicePaid; $user->notify(new InvoicePaid($invoice));
Notifiable 트레이트는 모델에서 사용할 수 있습니다. User 모델에만 포함하는 데 제한되지 않습니다.
Notification 파사드 사용
또는 Notification 파사드를 통해 알림을 보낼 수 있습니다. 이 방법은 사용자 컬렉션과 같이 여러 알림 엔터티에 알림을 보내야 할 때 유용합니다. 파사드를 사용하여 알림을 보내려면 모든 알림 엔터티와 알림 인스턴스를 send 메서드에 전달하세요.
use Illuminate\Support\Facades\Notification; Notification::send($users, new InvoicePaid($invoice));
sendNow 메서드를 사용하여 즉시 알림을 보낼 수도 있습니다. 이 메서드는 알림이 ShouldQueue 인터페이스를 구현하더라도 즉시 알림을 보냅니다.
Notification::sendNow($developers, new DeploymentCompleted($deployment));
배달 채널 지정
모든 알림 클래스에는 알림이 전달될 채널을 결정하는 via 메서드가 있습니다. 알림은 mail, database, broadcast, vonage 및 slack 채널을 통해 보낼 수 있습니다.
Telegram 또는 Pusher와 같은 다른 배달 채널을 사용하려면 커뮤니티에서 운영하는 Laravel Notification Channels 웹사이트를 확인하세요.
via 메서드는 알림이 전송될 클래스의 인스턴스인 $notifiable 인스턴스를 받습니다. $notifiable를 사용하여 알림이 전달되어야 하는 채널을 결정할 수 있습니다.
/** * 알림의 배달 채널을 가져옵니다. * * @return array<int, string> */public function via(object $notifiable): array{ return $notifiable->prefers_sms ? ['vonage'] : ['mail', 'database'];}
알림 대기열 처리
알림 대기열 처리 전에 큐를 구성하고 워커를 시작해야 합니다.
알림을 보내는 데 시간이 걸릴 수 있으며, 특히 채널이 알림을 전달하기 위해 외부 API 호출을 해야 하는 경우 더욱 그렇습니다. 애플리케이션의 응답 시간을 단축하려면 클래스에 ShouldQueue 인터페이스와 Queueable 트레이트를 추가하여 알림을 대기열에 넣으세요. 인터페이스와 트레이트는 make:notification 명령을 사용하여 생성된 모든 알림에 대해 이미 가져와져 있으므로 알림 클래스에 즉시 추가할 수 있습니다.
<?php namespace App\Notifications; use Illuminate\Bus\Queueable;use Illuminate\Contracts\Queue\ShouldQueue;use Illuminate\Notifications\Notification; class InvoicePaid extends Notification implements ShouldQueue{ use Queueable; // ...}
ShouldQueue 인터페이스가 알림에 추가되면 알림을 정상적으로 보낼 수 있습니다. Laravel은 클래스에서 ShouldQueue 인터페이스를 감지하고 알림 전달을 자동으로 대기열에 넣습니다.
$user->notify(new InvoicePaid($invoice));
알림을 대기열에 넣을 때 각 수신자와 채널 조합에 대해 대기열 작업이 생성됩니다. 예를 들어, 알림에 3명의 수신자와 2개의 채널이 있는 경우 6개의 작업이 대기열로 디스패치됩니다.
알림 지연
알림 전달을 지연시키려면 알림 인스턴스화에 delay 메서드를 연결할 수 있습니다.
$delay = now()->addMinutes(10); $user->notify((new InvoicePaid($invoice))->delay($delay));
delay 메서드에 배열을 전달하여 특정 채널에 대한 지연 시간을 지정할 수 있습니다.
$user->notify((new InvoicePaid($invoice))->delay([ 'mail' => now()->addMinutes(5), 'sms' => now()->addMinutes(10),]));
또는 알림 클래스 자체에서 withDelay 메서드를 정의할 수 있습니다. withDelay 메서드는 채널 이름과 지연 값의 배열을 반환해야 합니다.
/** * 알림의 전달 지연을 결정합니다. * * @return array<string, \Illuminate\Support\Carbon> */public function withDelay(object $notifiable): array{ return [ 'mail' => now()->addMinutes(5), 'sms' => now()->addMinutes(10), ];}
알림 큐 연결 사용자 지정
기본적으로 큐에 있는 알림은 애플리케이션의 기본 큐 연결을 사용하여 큐에 추가됩니다. 특정 알림에 사용해야 하는 다른 연결을 지정하려면 알림의 생성자에서 onConnection 메서드를 호출할 수 있습니다.
<?php namespace App\Notifications; use Illuminate\Bus\Queueable;use Illuminate\Contracts\Queue\ShouldQueue;use Illuminate\Notifications\Notification; class InvoicePaid extends Notification implements ShouldQueue{ use Queueable; /** * 새로운 알림 인스턴스를 만듭니다. */ public function __construct() { $this->onConnection('redis'); }}
또는 알림에서 지원하는 각 알림 채널에 사용해야 하는 특정 큐 연결을 지정하려면 알림에서 viaConnections 메서드를 정의할 수 있습니다. 이 메서드는 채널 이름/큐 연결 이름 쌍의 배열을 반환해야 합니다.
/** * 각 알림 채널에 사용해야 하는 연결을 결정합니다. * * @return array<string, string> */public function viaConnections(): array{ return [ 'mail' => 'redis', 'database' => 'sync', ];}
알림 채널 큐 사용자 지정
알림에서 지원하는 각 알림 채널에 사용해야 하는 특정 큐를 지정하려면 알림에서 viaQueues 메서드를 정의할 수 있습니다. 이 메서드는 채널 이름/큐 이름 쌍의 배열을 반환해야 합니다.
/** * 각 알림 채널에 사용해야 하는 큐를 결정합니다. * * @return array<string, string> */public function viaQueues(): array{ return [ 'mail' => 'mail-queue', 'slack' => 'slack-queue', ];}
큐에 있는 알림 미들웨어
큐에 있는 알림은 큐에 있는 작업과 마찬가지로 미들웨어를 정의할 수 있습니다. 시작하려면 알림 클래스에서 middleware 메서드를 정의하세요. middleware 메서드는 $notifiable 및 $channel 변수를 받으며, 이를 통해 알림의 대상에 따라 반환된 미들웨어를 사용자 지정할 수 있습니다.
use Illuminate\Queue\Middleware\RateLimited; /** * 알림 작업이 통과해야 하는 미들웨어를 가져옵니다. * * @return array<int, object> */public function middleware(object $notifiable, string $channel){ return match ($channel) { 'email' => [new RateLimited('postmark')], 'slack' => [new RateLimited('slack')], default => [], };}
큐에 있는 알림 및 데이터베이스 트랜잭션
큐에 있는 알림이 데이터베이스 트랜잭션 내에서 디스패치되면 데이터베이스 트랜잭션이 커밋되기 전에 큐에서 처리될 수 있습니다. 이 경우 데이터베이스 트랜잭션 중에 모델 또는 데이터베이스 레코드에 적용한 업데이트가 아직 데이터베이스에 반영되지 않았을 수 있습니다. 또한 트랜잭션 내에서 생성된 모델 또는 데이터베이스 레코드가 데이터베이스에 존재하지 않을 수 있습니다. 알림이 이러한 모델에 종속된 경우 큐에 있는 알림을 보내는 작업이 처리될 때 예기치 않은 오류가 발생할 수 있습니다.
큐 연결의 after_commit 구성 옵션이 false로 설정된 경우에도 특정 큐에 있는 알림을 모든 열린 데이터베이스 트랜잭션이 커밋된 후에 디스패치해야 함을 알림을 보낼 때 afterCommit 메서드를 호출하여 표시할 수 있습니다.
use App\Notifications\InvoicePaid; $user->notify((new InvoicePaid($invoice))->afterCommit());
또는 알림의 생성자에서 afterCommit 메서드를 호출할 수 있습니다.
<?php namespace App\Notifications; use Illuminate\Bus\Queueable;use Illuminate\Contracts\Queue\ShouldQueue;use Illuminate\Notifications\Notification; class InvoicePaid extends Notification implements ShouldQueue{ use Queueable; /** * 새로운 알림 인스턴스를 만듭니다. */ public function __construct() { $this->afterCommit(); }}
이러한 문제를 해결하는 방법에 대해 자세히 알아보려면 큐에 있는 작업 및 데이터베이스 트랜잭션에 대한 문서를 검토하세요.
큐에 있는 알림을 보내야 하는지 여부 결정
큐에 있는 알림이 백그라운드 처리를 위해 큐로 디스패치된 후에는 일반적으로 큐 워커가 이를 수락하고 의도한 수신자에게 보냅니다.
그러나 큐 워커에서 처리한 후 큐에 있는 알림을 보내야 하는지 여부에 대한 최종 결정을 내리려면 알림 클래스에서 shouldSend 메서드를 정의할 수 있습니다. 이 메서드가 false를 반환하면 알림이 전송되지 않습니다.
/** * 알림을 보내야 하는지 결정합니다. */public function shouldSend(object $notifiable, string $channel): bool{ return $this->invoice->isPaid();}
주문형 알림
애플리케이션의 "사용자"로 저장되지 않은 사람에게 알림을 보내야 할 수 있습니다. Notification 파사드의 route 메서드를 사용하여 알림을 보내기 전에 임시 알림 라우팅 정보를 지정할 수 있습니다.
use Illuminate\Broadcasting\Channel;use Illuminate\Support\Facades\Notification; ->route('vonage', '5555555555') ->route('slack', '#slack-channel') ->route('broadcast', [new Channel('channel-name')]) ->notify(new InvoicePaid($invoice));
주문형 알림을 mail 경로로 보낼 때 수신자의 이름을 제공하려면 이메일 주소를 키로, 이름을 배열의 첫 번째 요소 값으로 포함하는 배열을 제공할 수 있습니다.
Notification::route('mail', [])->notify(new InvoicePaid($invoice));
routes 메서드를 사용하여 여러 알림 채널에 대한 임시 라우팅 정보를 한 번에 제공할 수 있습니다.
Notification::routes([ 'vonage' => '5555555555',])->notify(new InvoicePaid($invoice));
메일 알림
메일 메시지 포맷팅
알림을 이메일로 보낼 수 있는 경우 알림 클래스에 toMail 메서드를 정의해야 합니다. 이 메서드는 $notifiable 엔터티를 받고 Illuminate\Notifications\Messages\MailMessage 인스턴스를 반환해야 합니다.
MailMessage 클래스에는 트랜잭션 이메일 메시지를 빌드하는 데 도움이 되는 몇 가지 간단한 메서드가 포함되어 있습니다. 메일 메시지에는 "행동 유도"뿐만 아니라 텍스트 줄이 포함될 수 있습니다. toMail 메서드의 예를 살펴보겠습니다.
/** * 알림의 메일 표현을 가져옵니다. */public function toMail(object $notifiable): MailMessage{ $url = url('/invoice/'.$this->invoice->id); return (new MailMessage) ->greeting('안녕하세요!') ->line('청구서 중 하나가 결제되었습니다!') ->lineIf($this->amount > 0, "결제 금액: {$this->amount}") ->action('청구서 보기', $url) ->line('애플리케이션을 이용해 주셔서 감사합니다!');}
toMail 메서드에서 $this->invoice->id를 사용하고 있습니다. 메시지를 생성하기 위해 알림에 필요한 모든 데이터를 알림의 생성자에 전달할 수 있습니다.
이 예에서는 인사말, 텍스트 줄, 행동 유도, 그리고 다른 텍스트 줄을 등록합니다. MailMessage 객체에서 제공하는 이러한 메서드를 사용하면 작은 트랜잭션 이메일을 간단하고 빠르게 포맷팅할 수 있습니다. 그런 다음 메일 채널은 메시지 구성 요소를 일반 텍스트 대응 기능이 있는 아름답고 반응이 빠른 HTML 이메일 템플릿으로 변환합니다. 다음은 mail 채널에서 생성된 이메일의 예입니다.
메일 알림을 보낼 때 config/app.php 구성 파일에서 name 구성 옵션을 설정해야 합니다. 이 값은 메일 알림 메시지의 머리글과 바닥글에 사용됩니다.
오류 메시지
일부 알림은 실패한 청구서 결제와 같은 오류를 사용자에게 알립니다. 메시지를 빌드할 때 error 메서드를 호출하여 메일 메시지가 오류에 관한 것임을 나타낼 수 있습니다. 메일 메시지에서 error 메서드를 사용하는 경우 행동 유도 버튼은 검은색 대신 빨간색으로 표시됩니다.
/** * 알림의 메일 표현을 가져옵니다. */public function toMail(object $notifiable): MailMessage{ return (new MailMessage) ->error() ->subject('청구서 결제 실패') ->line('...');}
기타 메일 알림 포맷팅 옵션
알림 클래스에서 텍스트 "줄"을 정의하는 대신 view 메서드를 사용하여 알림 이메일을 렌더링하는 데 사용해야 하는 사용자 지정 템플릿을 지정할 수 있습니다.
/** * 알림의 메일 표현을 가져옵니다. */public function toMail(object $notifiable): MailMessage{ return (new MailMessage)->view( 'mail.invoice.paid', ['invoice' => $this->invoice] );}
view 메서드에 제공된 배열의 두 번째 요소로 뷰 이름을 전달하여 메일 메시지에 대한 일반 텍스트 뷰를 지정할 수 있습니다.
/** * 알림의 메일 표현을 가져옵니다. */public function toMail(object $notifiable): MailMessage{ return (new MailMessage)->view( ['mail.invoice.paid', 'mail.invoice.paid-text'], ['invoice' => $this->invoice] );}
또는 메시지에 일반 텍스트 뷰만 있는 경우 text 메서드를 활용할 수 있습니다.
/** * 알림의 메일 표현을 가져옵니다. */public function toMail(object $notifiable): MailMessage{ return (new MailMessage)->text( 'mail.invoice.paid-text', ['invoice' => $this->invoice] );}
발신자 사용자 지정
기본적으로 이메일의 발신자/보낸 사람 주소는 config/mail.php 구성 파일에 정의되어 있습니다. 그러나 from 메서드를 사용하여 특정 알림에 대한 보낸 사람 주소를 지정할 수 있습니다.
/** * 알림의 메일 표현을 가져옵니다. */public function toMail(object $notifiable): MailMessage{ return (new MailMessage) ->line('...');}
수신자 사용자 지정
mail 채널을 통해 알림을 보낼 때 알림 시스템은 알림 가능 엔터티에서 email 속성을 자동으로 찾습니다. 알림 전달에 사용되는 이메일 주소를 사용자 지정하려면 알림 가능 엔터티에서 routeNotificationForMail 메서드를 정의할 수 있습니다.
<?php namespace App\Models; use Illuminate\Foundation\Auth\User as Authenticatable;use Illuminate\Notifications\Notifiable;use Illuminate\Notifications\Notification; class User extends Authenticatable{ use Notifiable; /** * 메일 채널에 대한 알림 경로를 지정합니다. * * @return array<string, string>|string */ public function routeNotificationForMail(Notification $notification): array|string { // 이메일 주소만 반환... return $this->email_address; // 이메일 주소와 이름 반환... return [$this->email_address => $this->name]; }}
제목 사용자 지정
기본적으로 이메일의 제목은 "제목 케이스"로 포맷된 알림의 클래스 이름입니다. 따라서 알림 클래스 이름이 InvoicePaid인 경우 이메일의 제목은 청구서 결제됨입니다. 메시지에 대해 다른 제목을 지정하려면 메시지를 빌드할 때 subject 메서드를 호출할 수 있습니다.
/** * 알림의 메일 표현을 가져옵니다. */public function toMail(object $notifiable): MailMessage{ return (new MailMessage) ->subject('알림 제목') ->line('...');}
메일러 사용자 지정
기본적으로 이메일 알림은 config/mail.php 구성 파일에 정의된 기본 메일러를 사용하여 전송됩니다. 그러나 메시지를 빌드할 때 mailer 메서드를 호출하여 런타임에 다른 메일러를 지정할 수 있습니다.
/** * 알림의 메일 표현을 가져옵니다. */public function toMail(object $notifiable): MailMessage{ return (new MailMessage) ->mailer('postmark') ->line('...');}
템플릿 사용자 지정
알림 패키지의 리소스를 게시하여 메일 알림에서 사용하는 HTML 및 일반 텍스트 템플릿을 수정할 수 있습니다. 이 명령을 실행한 후 메일 알림 템플릿은 resources/views/vendor/notifications 디렉토리에 있습니다.
php artisan vendor:publish --tag=laravel-notifications
쉘 명령어 php artisan vendor:publish --tag=laravel-notifications
첨부 파일
이메일 알림에 첨부 파일을 추가하려면 메시지를 작성하는 동안 attach 메서드를 사용하십시오. attach 메서드는 파일의 절대 경로를 첫 번째 인수로 받습니다.
/** * Get the mail representation of the notification. */public function toMail(object $notifiable): MailMessage{ return (new MailMessage) ->greeting('Hello!') ->attach('/path/to/file');}
알림 메일 메시지에서 제공하는 attach 메서드는 첨부 가능한 객체도 허용합니다. 자세한 내용은 첨부 가능한 객체 설명서를 참조하십시오.
메시지에 파일을 첨부할 때 attach 메서드에 두 번째 인수로 array를 전달하여 표시 이름 및/또는 MIME 유형을 지정할 수도 있습니다.
/** * Get the mail representation of the notification. */public function toMail(object $notifiable): MailMessage{ return (new MailMessage) ->greeting('Hello!') ->attach('/path/to/file', [ 'as' => 'name.pdf', 'mime' => 'application/pdf', ]);}
메일 객체에 파일을 첨부하는 것과 달리, attachFromStorage를 사용하여 스토리지 디스크에서 파일을 직접 첨부할 수 없습니다. 대신 스토리지 디스크의 파일에 대한 절대 경로와 함께 attach 메서드를 사용해야 합니다. 또는 toMail 메서드에서 메일을 반환할 수도 있습니다.
use App\Mail\InvoicePaid as InvoicePaidMailable; /** * Get the mail representation of the notification. */public function toMail(object $notifiable): Mailable{ return (new InvoicePaidMailable($this->invoice)) ->to($notifiable->email) ->attachFromStorage('/path/to/file');}
필요한 경우 attachMany 메서드를 사용하여 여러 파일을 메시지에 첨부할 수 있습니다.
/** * Get the mail representation of the notification. */public function toMail(object $notifiable): MailMessage{ return (new MailMessage) ->greeting('Hello!') ->attachMany([ '/path/to/forge.svg', '/path/to/vapor.svg' => [ 'as' => 'Logo.svg', 'mime' => 'image/svg+xml', ], ]);}
원시 데이터 첨부 파일
attachData 메서드를 사용하여 원시 바이트 문자열을 첨부 파일로 첨부할 수 있습니다. attachData 메서드를 호출할 때 첨부 파일에 할당해야 하는 파일 이름을 제공해야 합니다.
/** * Get the mail representation of the notification. */public function toMail(object $notifiable): MailMessage{ return (new MailMessage) ->greeting('Hello!') ->attachData($this->pdf, 'name.pdf', [ 'mime' => 'application/pdf', ]);}
태그 및 메타데이터 추가
Mailgun 및 Postmark와 같은 일부 타사 이메일 제공업체는 애플리케이션에서 보낸 이메일을 그룹화하고 추적하는 데 사용할 수 있는 메시지 "태그" 및 "메타데이터"를 지원합니다. tag 및 metadata 메서드를 통해 이메일 메시지에 태그와 메타데이터를 추가할 수 있습니다.
/** * Get the mail representation of the notification. */public function toMail(object $notifiable): MailMessage{ return (new MailMessage) ->greeting('Comment Upvoted!') ->tag('upvote') ->metadata('comment_id', $this->comment->id);}
애플리케이션에서 Mailgun 드라이버를 사용하는 경우 태그 및 메타데이터에 대한 자세한 내용은 Mailgun 설명서를 참조하십시오. 마찬가지로 태그 및 메타데이터에 대한 지원에 대한 자세한 내용은 Postmark 설명서를 참조할 수 있습니다.
애플리케이션에서 Amazon SES를 사용하여 이메일을 보내는 경우 metadata 메서드를 사용하여 메시지에 SES "태그"를 첨부해야 합니다.
Symfony 메시지 사용자 지정
MailMessage 클래스의 withSymfonyMessage 메서드를 사용하면 메시지를 보내기 전에 Symfony Message 인스턴스로 호출되는 클로저를 등록할 수 있습니다. 이렇게 하면 메시지를 전달하기 전에 메시지를 세부적으로 사용자 지정할 수 있습니다.
use Symfony\Component\Mime\Email; /** * Get the mail representation of the notification. */public function toMail(object $notifiable): MailMessage{ return (new MailMessage) ->withSymfonyMessage(function (Email $message) { $message->getHeaders()->addTextHeader( 'Custom-Header', 'Header Value' ); });}
메일 사용
필요한 경우 알림의 toMail 메서드에서 전체 메일 객체를 반환할 수 있습니다. MailMessage 대신 Mailable을 반환할 때 메일 객체의 to 메서드를 사용하여 메시지 수신자를 지정해야 합니다.
use App\Mail\InvoicePaid as InvoicePaidMailable;use Illuminate\Mail\Mailable; /** * Get the mail representation of the notification. */public function toMail(object $notifiable): Mailable{ return (new InvoicePaidMailable($this->invoice)) ->to($notifiable->email);}
메일 및 주문형 알림
주문형 알림을 보내는 경우 toMail 메서드에 제공된 $notifiable 인스턴스는 Illuminate\Notifications\AnonymousNotifiable의 인스턴스가 됩니다. 이 인스턴스는 주문형 알림을 보내야 하는 이메일 주소를 검색하는 데 사용할 수 있는 routeNotificationFor 메서드를 제공합니다.
use App\Mail\InvoicePaid as InvoicePaidMailable;use Illuminate\Notifications\AnonymousNotifiable;use Illuminate\Mail\Mailable; /** * Get the mail representation of the notification. */public function toMail(object $notifiable): Mailable{ $address = $notifiable instanceof AnonymousNotifiable ? $notifiable->routeNotificationFor('mail') : $notifiable->email; return (new InvoicePaidMailable($this->invoice)) ->to($address);}
메일 알림 미리보기
메일 알림 템플릿을 디자인할 때 일반적인 Blade 템플릿처럼 브라우저에서 렌더링된 메일 메시지를 빠르게 미리 보는 것이 편리합니다. 이러한 이유로 Laravel을 사용하면 라우트 클로저 또는 컨트롤러에서 직접 메일 알림으로 생성된 메일 메시지를 반환할 수 있습니다. MailMessage가 반환되면 렌더링되어 브라우저에 표시되므로 실제 이메일 주소로 보낼 필요 없이 디자인을 빠르게 미리 볼 수 있습니다.
use App\Models\Invoice;use App\Notifications\InvoicePaid; Route::get('/notification', function () { $invoice = Invoice::find(1); return (new InvoicePaid($invoice)) ->toMail($invoice->user);});
마크다운 메일 알림
마크다운 메일 알림을 사용하면 메일 알림의 미리 빌드된 템플릿을 활용하는 동시에 더 길고 사용자 지정된 메시지를 작성할 수 있는 더 많은 자유를 얻을 수 있습니다. 메시지는 마크다운으로 작성되므로 Laravel은 메시지에 대해 아름답고 반응성이 뛰어난 HTML 템플릿을 렌더링하고 일반 텍스트 대응을 자동으로 생성할 수 있습니다.
메시지 생성
해당하는 마크다운 템플릿으로 알림을 생성하려면 make:notification Artisan 명령의 --markdown 옵션을 사용하면 됩니다.
php artisan make:notification InvoicePaid --markdown=mail.invoice.paid
다른 모든 메일 알림과 마찬가지로, 마크다운 템플릿을 사용하는 알림은 알림 클래스에 toMail 메서드를 정의해야 합니다. 그러나 알림을 구성하기 위해 line 및 action 메서드를 사용하는 대신 markdown 메서드를 사용하여 사용할 마크다운 템플릿의 이름을 지정합니다. 템플릿에서 사용할 수 있도록 하려는 데이터 배열을 메서드의 두 번째 인수로 전달할 수 있습니다.
/** * 알림의 메일 표현을 가져옵니다. */public function toMail(object $notifiable): MailMessage{ $url = url('/invoice/'.$this->invoice->id); return (new MailMessage) ->subject('송장 결제 완료') ->markdown('mail.invoice.paid', ['url' => $url]);}
메시지 작성하기
마크다운 메일 알림은 Blade 컴포넌트와 마크다운 구문의 조합을 사용하여 Laravel에서 미리 제작된 알림 컴포넌트를 활용하면서 쉽게 알림을 구성할 수 있도록 합니다.
<x-mail::message># 송장 결제 완료 귀하의 송장이 결제되었습니다! <x-mail::button :url="$url">송장 보기</x-mail::button> 감사합니다,<br>{{ config('app.name') }}</x-mail::message>
버튼 컴포넌트
버튼 컴포넌트는 가운데 정렬된 버튼 링크를 렌더링합니다. 컴포넌트는 url과 선택적인 color 두 개의 인수를 받습니다. 지원되는 색상은 primary, green 및 red입니다. 원하는 만큼 많은 버튼 컴포넌트를 알림에 추가할 수 있습니다.
<x-mail::button :url="$url" color="green">송장 보기</x-mail::button>
패널 컴포넌트
패널 컴포넌트는 알림의 나머지 부분과 배경색이 약간 다른 패널에 지정된 텍스트 블록을 렌더링합니다. 이를 통해 주어진 텍스트 블록에 주의를 집중시킬 수 있습니다.
<x-mail::panel>이것은 패널 내용입니다.</x-mail::panel>
테이블 컴포넌트
테이블 컴포넌트를 사용하면 Markdown 테이블을 HTML 테이블로 변환할 수 있습니다. 이 컴포넌트는 Markdown 테이블을 내용으로 받습니다. 테이블 열 정렬은 기본 Markdown 테이블 정렬 구문을 사용하여 지원됩니다.
<x-mail::table>| Laravel | Table | Example || ------------- | :-----------: | ------------: || Col 2 is | Centered | $10 || Col 3 is | Right-Aligned | $20 |</x-mail::table>
컴포넌트 커스터마이징
사용자 정의를 위해 모든 Markdown 알림 컴포넌트를 사용자 애플리케이션으로 내보낼 수 있습니다. 컴포넌트를 내보내려면 vendor:publish Artisan 명령을 사용하여 laravel-mail 에셋 태그를 게시하십시오.
php artisan vendor:publish --tag=laravel-mail
이 명령어는 Markdown 메일 컴포넌트를 resources/views/vendor/mail 디렉토리로 게시합니다. mail 디렉토리에는 html과 text 디렉토리가 있으며, 각 디렉토리에는 사용 가능한 모든 컴포넌트의 해당 표현이 포함됩니다. 이러한 컴포넌트를 원하는 대로 자유롭게 사용자 정의할 수 있습니다.
CSS 사용자 정의
컴포넌트를 내보낸 후, resources/views/vendor/mail/html/themes 디렉토리에는 default.css 파일이 포함됩니다. 이 파일에서 CSS를 사용자 정의하면 스타일이 Markdown 알림의 HTML 표현 내에 자동으로 인라인됩니다.
Laravel의 Markdown 컴포넌트에 대한 완전히 새로운 테마를 만들고 싶다면 html/themes 디렉토리 내에 CSS 파일을 넣을 수 있습니다. CSS 파일을 이름 짓고 저장한 후, 새 테마의 이름과 일치하도록 mail 구성 파일의 theme 옵션을 업데이트하세요.
개별 알림에 대한 테마를 사용자 정의하려면 알림의 메일 메시지를 빌드하는 동안 theme 메서드를 호출하면 됩니다. theme 메서드는 알림을 보낼 때 사용할 테마의 이름을 허용합니다.
/** * 알림의 메일 표현을 가져옵니다. */public function toMail(object $notifiable): MailMessage{ return (new MailMessage) ->theme('invoice') ->subject('Invoice Paid') ->markdown('mail.invoice.paid', ['url' => $url]);}
데이터베이스 알림
필요 조건
database 알림 채널은 데이터베이스 테이블에 알림 정보를 저장합니다. 이 테이블에는 알림 유형과 알림을 설명하는 JSON 데이터 구조와 같은 정보가 포함됩니다.
테이블을 쿼리하여 애플리케이션의 사용자 인터페이스에 알림을 표시할 수 있습니다. 하지만 그 전에 알림을 저장할 데이터베이스 테이블을 만들어야 합니다. make:notifications-table 명령어를 사용하여 적절한 테이블 스키마로 마이그레이션을 생성할 수 있습니다.
php artisan make:notifications-table php artisan migrate
알림 모델이 UUID 또는 ULID 기본 키를 사용하는 경우, 알림 테이블 마이그레이션에서 morphs 메서드를 uuidMorphs 또는 ulidMorphs로 대체해야 합니다.
데이터베이스 알림 포맷팅
알림이 데이터베이스 테이블에 저장되는 것을 지원하는 경우, 알림 클래스에서 toDatabase 또는 toArray 메서드를 정의해야 합니다. 이 메서드는 $notifiable 엔터티를 받아서 일반 PHP 배열을 반환해야 합니다. 반환된 배열은 JSON으로 인코딩되어 notifications 테이블의 data 컬럼에 저장됩니다. toArray 메서드의 예시를 살펴봅시다:
/** * 알림의 배열 표현을 가져옵니다. * * @return array<string, mixed> */public function toArray(object $notifiable): array{ return [ 'invoice_id' => $this->invoice->id, 'amount' => $this->invoice->amount, ];}
알림이 애플리케이션의 데이터베이스에 저장되면, type 컬럼은 알림의 클래스 이름으로 채워집니다. 그러나 알림 클래스에 databaseType 메서드를 정의하여 이 동작을 사용자 정의할 수 있습니다:
/** * 알림의 데이터베이스 타입을 가져옵니다. * * @return string */public function databaseType(object $notifiable): string{ return 'invoice-paid';}
toDatabase vs. toArray
toArray 메서드는 broadcast 채널에서도 JavaScript 기반 프론트엔드로 브로드캐스트할 데이터를 결정하는 데 사용됩니다. database 및 broadcast 채널에 대해 서로 다른 두 개의 배열 표현을 원한다면, toArray 메서드 대신 toDatabase 메서드를 정의해야 합니다.
알림 접근
알림이 데이터베이스에 저장되면, 알림을 받는 엔터티에서 알림에 접근하는 편리한 방법이 필요합니다. Laravel의 기본 App\Models\User 모델에 포함된 Illuminate\Notifications\Notifiable 트레이트는 엔터티의 알림을 반환하는 notifications Eloquent 관계를 포함합니다. 알림을 가져오려면 다른 Eloquent 관계처럼 이 메서드에 접근할 수 있습니다. 기본적으로 알림은 created_at 타임스탬프를 기준으로 정렬되며, 가장 최근의 알림이 컬렉션의 시작 부분에 있습니다:
$user = App\Models\User::find(1); foreach ($user->notifications as $notification) { echo $notification->type;}
"읽지 않은" 알림만 검색하려면 unreadNotifications 관계를 사용할 수 있습니다. 다시 말하지만, 이러한 알림은 created_at 타임스탬프를 기준으로 정렬되며, 가장 최근의 알림이 컬렉션의 시작 부분에 있습니다:
$user = App\Models\User::find(1); foreach ($user->unreadNotifications as $notification) { echo $notification->type;}
JavaScript 클라이언트에서 알림에 접근하려면, 현재 사용자와 같은 알림을 받을 수 있는 엔터티의 알림을 반환하는 애플리케이션에 대한 알림 컨트롤러를 정의해야 합니다. 그런 다음 JavaScript 클라이언트에서 해당 컨트롤러의 URL로 HTTP 요청을 할 수 있습니다.
알림을 읽음으로 표시하기
일반적으로 사용자가 알림을 볼 때 알림을 "읽음"으로 표시하고 싶을 것입니다. Illuminate\Notifications\Notifiable 트레이트는 알림의 데이터베이스 레코드에서 read_at 컬럼을 업데이트하는 markAsRead 메서드를 제공합니다:
$user = App\Models\User::find(1); foreach ($user->unreadNotifications as $notification) { $notification->markAsRead();}
그러나 각 알림을 반복하는 대신 알림 컬렉션에서 직접 markAsRead 메서드를 사용할 수 있습니다:
$user->unreadNotifications->markAsRead();
데이터베이스에서 검색하지 않고 모든 알림을 읽음으로 표시하기 위해 대량 업데이트 쿼리를 사용할 수도 있습니다:
$user = App\Models\User::find(1); $user->unreadNotifications()->update(['read_at' => now()]);
테이블에서 완전히 제거하기 위해 알림을 delete할 수 있습니다:
$user->notifications()->delete();
브로드캐스트 알림
사전 준비 사항
알림을 브로드캐스팅하기 전에 Laravel의 이벤트 브로드캐스팅 서비스에 익숙해지고 구성해야 합니다. 이벤트 브로드캐스팅은 JavaScript 기반 프론트엔드에서 서버 측 Laravel 이벤트에 반응하는 방법을 제공합니다.
브로드캐스트 알림 포맷팅
broadcast 채널은 Laravel의 이벤트 브로드캐스팅 서비스를 사용하여 알림을 브로드캐스팅하므로, JavaScript 기반 프론트엔드에서 실시간으로 알림을 포착할 수 있습니다. 알림이 브로드캐스팅을 지원하는 경우, 알림 클래스에 toBroadcast 메서드를 정의할 수 있습니다. 이 메서드는 $notifiable 엔터티를 받아서 BroadcastMessage 인스턴스를 반환해야 합니다. toBroadcast 메서드가 존재하지 않으면, 브로드캐스트할 데이터를 수집하기 위해 toArray 메서드가 사용됩니다. 반환된 데이터는 JSON으로 인코딩되어 JavaScript 기반 프론트엔드로 브로드캐스트됩니다. toBroadcast 메서드의 예시를 살펴봅시다:
use Illuminate\Notifications\Messages\BroadcastMessage; /** * 알림의 브로드캐스트 가능한 표현을 가져옵니다. */public function toBroadcast(object $notifiable): BroadcastMessage{ return new BroadcastMessage([ 'invoice_id' => $this->invoice->id, 'amount' => $this->invoice->amount, ]);}
브로드캐스트 큐 구성
모든 브로드캐스트 알림은 브로드캐스팅을 위해 큐에 대기합니다. 브로드캐스트 작업을 큐에 대기시키는 데 사용되는 큐 연결 또는 큐 이름을 구성하려면 BroadcastMessage의 onConnection 및 onQueue 메서드를 사용할 수 있습니다:
return (new BroadcastMessage($data)) ->onConnection('sqs') ->onQueue('broadcasts');
알림 유형 사용자 정의
지정한 데이터 외에도 모든 브로드캐스트 알림에는 알림의 전체 클래스 이름이 포함된 type 필드가 있습니다. 알림 type을 사용자 정의하려면 알림 클래스에 broadcastType 메서드를 정의할 수 있습니다:
/** * 브로드캐스트되는 알림의 유형을 가져옵니다. */public function broadcastType(): string{ return 'broadcast.message';}
알림 수신
알림은 {notifiable}.{id} 규칙을 사용하여 포맷된 개인 채널에서 브로드캐스트됩니다. 따라서 ID가 1인 App\Models\User 인스턴스로 알림을 보내는 경우, 알림은 App.Models.User.1 개인 채널에서 브로드캐스트됩니다. Laravel Echo를 사용하는 경우, notification 메서드를 사용하여 채널에서 알림을 쉽게 수신할 수 있습니다:
Echo.private('App.Models.User.' + userId) .notification((notification) => { console.log(notification.type); });
알림 채널 사용자 정의
엔터티의 브로드캐스트 알림이 브로드캐스트되는 채널을 사용자 정의하려면, 알림을 받을 수 있는 엔터티에 receivesBroadcastNotificationsOn 메서드를 정의할 수 있습니다:
<?php namespace App\Models; use Illuminate\Broadcasting\PrivateChannel;use Illuminate\Foundation\Auth\User as Authenticatable;use Illuminate\Notifications\Notifiable; class User extends Authenticatable{ use Notifiable; /** * 사용자가 알림 브로드캐스트를 수신하는 채널입니다. */ public function receivesBroadcastNotificationsOn(): string { return 'users.'.$this->id; }}
SMS 알림
사전 준비 사항
Laravel에서 SMS 알림을 보내는 기능은 Vonage (이전에는 Nexmo로 알려짐)에서 제공합니다. Vonage를 통해 알림을 보내기 전에 laravel/vonage-notification-channel 및 guzzlehttp/guzzle 패키지를 설치해야 합니다:
composer require laravel/vonage-notification-channel guzzlehttp/guzzle
이 패키지에는 구성 파일이 포함되어 있습니다. 그러나 이 구성 파일을 자신의 애플리케이션으로 내보낼 필요는 없습니다. VONAGE_KEY 및 VONAGE_SECRET 환경 변수를 사용하여 Vonage 공개 및 비밀 키를 정의할 수 있습니다.
키를 정의한 후, 기본적으로 SMS 메시지를 보낼 전화 번호를 정의하는 VONAGE_SMS_FROM 환경 변수를 설정해야 합니다. Vonage 제어판에서 이 전화 번호를 생성할 수 있습니다:
VONAGE_SMS_FROM=15556666666
SMS 알림 포맷팅
알림이 SMS로 전송되는 것을 지원하는 경우, 알림 클래스에서 toVonage 메서드를 정의해야 합니다. 이 메서드는 $notifiable 엔터티를 받아서 Illuminate\Notifications\Messages\VonageMessage 인스턴스를 반환해야 합니다:
use Illuminate\Notifications\Messages\VonageMessage; /** * 알림의 Vonage / SMS 표현을 가져옵니다. */public function toVonage(object $notifiable): VonageMessage{ return (new VonageMessage) ->content('Your SMS message content');}
유니코드 콘텐츠
SMS 메시지에 유니코드 문자가 포함되는 경우, VonageMessage 인스턴스를 구성할 때 unicode 메서드를 호출해야 합니다:
use Illuminate\Notifications\Messages\VonageMessage; /** * 알림의 Vonage / SMS 표현을 가져옵니다. */public function toVonage(object $notifiable): VonageMessage{ return (new VonageMessage) ->content('Your unicode message') ->unicode();}
"보내는 사람" 번호 사용자 정의
VONAGE_SMS_FROM 환경 변수에 지정된 전화 번호와 다른 전화 번호에서 일부 알림을 보내려면 VonageMessage 인스턴스에서 from 메서드를 호출할 수 있습니다:
use Illuminate\Notifications\Messages\VonageMessage; /** * 알림의 Vonage / SMS 표현을 가져옵니다. */public function toVonage(object $notifiable): VonageMessage{ return (new VonageMessage) ->content('Your SMS message content') ->from('15554443333');}
클라이언트 참조 추가
사용자, 팀 또는 클라이언트별로 비용을 추적하려면 알림에 "클라이언트 참조"를 추가할 수 있습니다. Vonage를 사용하면 이 클라이언트 참조를 사용하여 보고서를 생성하여 특정 고객의 SMS 사용량을 더 잘 이해할 수 있습니다. 클라이언트 참조는 최대 40자까지의 문자열이 될 수 있습니다:
use Illuminate\Notifications\Messages\VonageMessage; /** * 알림의 Vonage / SMS 표현을 가져옵니다. */public function toVonage(object $notifiable): VonageMessage{ return (new VonageMessage) ->clientReference((string) $notifiable->id) ->content('Your SMS message content');}
SMS 알림 라우팅
Vonage 알림을 적절한 전화 번호로 라우팅하려면 알림을 받을 수 있는 엔터티에 routeNotificationForVonage 메서드를 정의합니다:
<?php namespace App\Models; use Illuminate\Foundation\Auth\User as Authenticatable;use Illuminate\Notifications\Notifiable;use Illuminate\Notifications\Notification; class User extends Authenticatable{ use Notifiable; /** * Vonage 채널에 대한 알림을 라우팅합니다. */ public function routeNotificationForVonage(Notification $notification): string { return $this->phone_number; }}
Slack 알림
사전 준비 사항
Slack 알림을 보내기 전에 Composer를 통해 Slack 알림 채널을 설치해야 합니다:
composer require laravel/slack-notification-channel
또한 Slack 작업 공간에 대한 Slack 앱을 만들어야 합니다.
앱이 생성된 것과 동일한 Slack 작업 공간으로만 알림을 보내야 하는 경우, 앱에 chat:write, chat:write.public, chat:write.customize 범위가 있는지 확인해야 합니다. Slack 앱으로 메시지를 보내려면 앱에 chat:write:bot 범위도 있는지 확인해야 합니다. 이러한 범위는 Slack 내의 "OAuth 및 권한" 앱 관리 탭에서 추가할 수 있습니다.
다음으로, 앱의 "Bot User OAuth Token"을 복사하여 애플리케이션의 services.php 구성 파일의 slack 구성 배열 내에 넣습니다. 이 토큰은 Slack 내의 "OAuth 및 권한" 탭에서 찾을 수 있습니다.
'slack' => [ 'notifications' => [ 'bot_user_oauth_token' => env('SLACK_BOT_USER_OAUTH_TOKEN'), 'channel' => env('SLACK_BOT_USER_DEFAULT_CHANNEL'), ],],
앱 배포
애플리케이션에서 애플리케이션 사용자가 소유한 외부 Slack 작업 공간으로 알림을 보내는 경우 Slack을 통해 앱을 "배포"해야 합니다. 앱 배포는 Slack 내의 앱의 "배포 관리" 탭에서 관리할 수 있습니다. 앱이 배포되면 Socialite를 사용하여 애플리케이션 사용자를 대신하여 Slack Bot 토큰을 얻을 수 있습니다.
Slack 알림 포맷 지정
알림을 Slack 메시지로 보낼 수 있는 경우 알림 클래스에 toSlack 메서드를 정의해야 합니다. 이 메서드는 $notifiable 엔터티를 수신하고 Illuminate\Notifications\Slack\SlackMessage 인스턴스를 반환해야 합니다. Slack의 Block Kit API를 사용하여 풍부한 알림을 구성할 수 있습니다. 다음 예제는 Slack의 Block Kit 빌더에서 미리 볼 수 있습니다.
use Illuminate\Notifications\Slack\BlockKit\Blocks\ContextBlock;use Illuminate\Notifications\Slack\BlockKit\Blocks\SectionBlock;use Illuminate\Notifications\Slack\BlockKit\Composites\ConfirmObject;use Illuminate\Notifications\Slack\SlackMessage; /** * 알림의 Slack 표현을 가져옵니다. */public function toSlack(object $notifiable): SlackMessage{ return (new SlackMessage) ->text('One of your invoices has been paid!') ->headerBlock('Invoice Paid') ->contextBlock(function (ContextBlock $block) { $block->text('Customer #1234'); }) ->sectionBlock(function (SectionBlock $block) { $block->text('An invoice has been paid.'); $block->field("*Invoice No:*\n1000")->markdown(); }) ->dividerBlock() ->sectionBlock(function (SectionBlock $block) { $block->text('Congratulations!'); });}
Slack의 Block Kit 빌더 템플릿 사용
유창한 메시지 빌더 메서드를 사용하여 Block Kit 메시지를 구성하는 대신 Slack의 Block Kit 빌더에서 생성된 원시 JSON 페이로드를 usingBlockKitTemplate 메서드에 제공할 수 있습니다.
use Illuminate\Notifications\Slack\SlackMessage;use Illuminate\Support\Str; /** * 알림의 Slack 표현을 가져옵니다. */public function toSlack(object $notifiable): SlackMessage{ $template = <<<JSON { "blocks": [ { "type": "header", "text": { "type": "plain_text", "text": "Team Announcement" } }, { "type": "section", "text": { "type": "plain_text", "text": "We are hiring!" } } ] } JSON; return (new SlackMessage) ->usingBlockKitTemplate($template);}
Slack 상호 작용
Slack의 Block Kit 알림 시스템은 사용자 상호 작용을 처리하는 강력한 기능을 제공합니다. 이러한 기능을 활용하려면 Slack 앱에서 "상호 작용"이 활성화되어 있어야 하며 애플리케이션에서 제공하는 URL을 가리키는 "요청 URL"이 구성되어 있어야 합니다. 이러한 설정은 Slack 내의 "상호 작용 및 바로 가기" 앱 관리 탭에서 관리할 수 있습니다.
다음 예에서는 actionsBlock 메서드를 사용하는데, Slack은 버튼을 클릭한 Slack 사용자, 클릭한 버튼의 ID 등을 포함하는 페이로드를 사용하여 애플리케이션의 "요청 URL"에 POST 요청을 보냅니다. 그러면 애플리케이션은 페이로드를 기반으로 수행할 작업을 결정할 수 있습니다. 또한 Slack에서 요청을 보냈는지 확인해야 합니다.
use Illuminate\Notifications\Slack\BlockKit\Blocks\ActionsBlock;use Illuminate\Notifications\Slack\BlockKit\Blocks\ContextBlock;use Illuminate\Notifications\Slack\BlockKit\Blocks\SectionBlock;use Illuminate\Notifications\Slack\SlackMessage; /** * 알림의 Slack 표현을 가져옵니다. */public function toSlack(object $notifiable): SlackMessage{ return (new SlackMessage) ->text('One of your invoices has been paid!') ->headerBlock('Invoice Paid') ->contextBlock(function (ContextBlock $block) { $block->text('Customer #1234'); }) ->sectionBlock(function (SectionBlock $block) { $block->text('An invoice has been paid.'); }) ->actionsBlock(function (ActionsBlock $block) { // ID는 기본적으로 "button_acknowledge_invoice"... $block->button('Acknowledge Invoice')->primary(); // ID를 수동으로 구성... $block->button('Deny')->danger()->id('deny_invoice'); });}
확인 모달
사용자가 작업을 수행하기 전에 확인해야 하는 경우, 버튼을 정의할 때 confirm 메서드를 호출할 수 있습니다. confirm 메서드는 메시지와 ConfirmObject 인스턴스를 받는 클로저를 허용합니다.
use Illuminate\Notifications\Slack\BlockKit\Blocks\ActionsBlock;use Illuminate\Notifications\Slack\BlockKit\Blocks\ContextBlock;use Illuminate\Notifications\Slack\BlockKit\Blocks\SectionBlock;use Illuminate\Notifications\Slack\BlockKit\Composites\ConfirmObject;use Illuminate\Notifications\Slack\SlackMessage; /** * 알림의 Slack 표현을 가져옵니다. */public function toSlack(object $notifiable): SlackMessage{ return (new SlackMessage) ->text('One of your invoices has been paid!') ->headerBlock('Invoice Paid') ->contextBlock(function (ContextBlock $block) { $block->text('Customer #1234'); }) ->sectionBlock(function (SectionBlock $block) { $block->text('An invoice has been paid.'); }) ->actionsBlock(function (ActionsBlock $block) { $block->button('Acknowledge Invoice') ->primary() ->confirm( 'Acknowledge the payment and send a thank you email?', function (ConfirmObject $dialog) { $dialog->confirm('Yes'); $dialog->deny('No'); } ); });}
Slack 블록 검사
빌드 중인 블록을 빠르게 검사하려면 SlackMessage 인스턴스에서 dd 메서드를 호출할 수 있습니다. dd 메서드는 브라우저에 페이로드 및 알림의 미리보기를 표시하는 Slack의 Block Kit 빌더에 대한 URL을 생성하고 덤프합니다. 원시 페이로드를 덤프하려면 dd 메서드에 true를 전달할 수 있습니다.
return (new SlackMessage) ->text('One of your invoices has been paid!') ->headerBlock('Invoice Paid') ->dd();
Slack 알림 라우팅
Slack 알림을 적절한 Slack 팀 및 채널로 보내려면 알림 가능 모델에 routeNotificationForSlack 메서드를 정의합니다. 이 메서드는 다음 세 가지 값 중 하나를 반환할 수 있습니다.
-
null- 알림 자체에 구성된 채널로 라우팅을 연기합니다.SlackMessage를 빌드할 때to메서드를 사용하여 알림 내에서 채널을 구성할 수 있습니다. - 알림을 보낼 Slack 채널을 지정하는 문자열(예:
#support-channel). - OAuth 토큰 및 채널 이름을 지정할 수 있는
SlackRoute인스턴스(예:SlackRoute::make($this->slack_channel, $this->slack_token)). 이 메서드는 외부 작업 공간으로 알림을 보내는 데 사용해야 합니다.
예를 들어, routeNotificationForSlack 메서드에서 #support-channel을 반환하면 애플리케이션의 services.php 구성 파일에 있는 Bot User OAuth 토큰과 연결된 작업 공간의 #support-channel 채널로 알림이 전송됩니다.
<?php namespace App\Models; use Illuminate\Foundation\Auth\User as Authenticatable;use Illuminate\Notifications\Notifiable;use Illuminate\Notifications\Notification; class User extends Authenticatable{ use Notifiable; /** * Slack 채널에 대한 알림을 라우팅합니다. */ public function routeNotificationForSlack(Notification $notification): mixed { return '#support-channel'; }}
외부 Slack 작업 공간으로 알림 보내기
[!참고] 외부 Slack 작업 공간으로 알림을 보내기 전에 Slack 앱이 배포되어야 합니다.
물론 애플리케이션 사용자가 소유한 Slack 작업 공간으로 알림을 보내려는 경우가 많습니다. 이렇게 하려면 먼저 사용자에 대한 Slack OAuth 토큰을 얻어야 합니다. 다행히 Laravel Socialite에는 사용자를 Slack으로 쉽게 인증하고 봇 토큰을 얻을 수 있도록 하는 Slack 드라이버가 포함되어 있습니다.
봇 토큰을 얻어 애플리케이션 데이터베이스에 저장한 후에는 SlackRoute::make 메서드를 사용하여 알림을 사용자의 작업 공간으로 라우팅할 수 있습니다. 또한 애플리케이션에서 사용자가 알림을 보낼 채널을 지정할 수 있는 기회를 제공해야 합니다.
<?php namespace App\Models; use Illuminate\Foundation\Auth\User as Authenticatable;use Illuminate\Notifications\Notifiable;use Illuminate\Notifications\Notification;use Illuminate\Notifications\Slack\SlackRoute; class User extends Authenticatable{ use Notifiable; /** * Slack 채널에 대한 알림을 라우팅합니다. */ public function routeNotificationForSlack(Notification $notification): mixed { return SlackRoute::make($this->slack_channel, $this->slack_token); }}
알림 지역화
Laravel을 사용하면 HTTP 요청의 현재 로캘이 아닌 다른 로캘로 알림을 보낼 수 있으며 알림이 대기열에 있는 경우에도 이 로캘을 기억합니다.
이를 위해 Illuminate\Notifications\Notification 클래스는 원하는 언어를 설정하는 locale 메서드를 제공합니다. 알림을 평가할 때 애플리케이션이 이 로캘로 변경된 다음 평가가 완료되면 이전 로캘로 되돌아갑니다.
$user->notify((new InvoicePaid($invoice))->locale('es'));
여러 알림 가능 항목의 지역화는 Notification 파사드를 통해 수행할 수도 있습니다.
Notification::locale('es')->send( $users, new InvoicePaid($invoice));
사용자 선호 로캘
경우에 따라 애플리케이션은 각 사용자의 선호 로캘을 저장합니다. 알림 가능 모델에서 HasLocalePreference 계약을 구현하면 알림을 보낼 때 Laravel이 이 저장된 로캘을 사용하도록 지시할 수 있습니다.
use Illuminate\Contracts\Translation\HasLocalePreference; class User extends Model implements HasLocalePreference{ /** * 사용자의 선호 로캘을 가져옵니다. */ public function preferredLocale(): string { return $this->locale; }}
인터페이스를 구현하면 Laravel은 모델에 알림 및 메일을 보낼 때 선호 로캘을 자동으로 사용합니다. 따라서 이 인터페이스를 사용할 때는 locale 메서드를 호출할 필요가 없습니다.
$user->notify(new InvoicePaid($invoice));
테스트
Notification 파사드의 fake 메서드를 사용하여 알림이 전송되지 않도록 할 수 있습니다. 일반적으로 알림 전송은 실제로 테스트하는 코드와 관련이 없습니다. 대부분의 경우 Laravel에 특정 알림을 보내도록 지시했다는 것만 어설션하면 충분합니다.
Notification 파사드의 fake 메서드를 호출한 후에는 알림을 사용자에게 보내도록 지시했는지 확인하고 알림이 수신한 데이터를 검사할 수도 있습니다.
<?php use App\Notifications\OrderShipped;use Illuminate\Support\Facades\Notification; test('주문이 배송될 수 있습니다', function () { Notification::fake(); // 주문 배송 수행... // 알림이 전송되지 않았는지 확인... Notification::assertNothingSent(); // 주어진 사용자에게 알림이 전송되었는지 확인... Notification::assertSentTo( [$user], OrderShipped::class ); // 알림이 전송되지 않았는지 확인... Notification::assertNotSentTo( [$user], AnotherNotification::class ); // 주어진 횟수만큼 알림이 전송되었는지 확인... Notification::assertCount(3);});
<?php namespace Tests\Feature; use App\Notifications\OrderShipped;use Illuminate\Support\Facades\Notification;use Tests\TestCase; class ExampleTest extends TestCase{ public function test_orders_can_be_shipped(): void { Notification::fake(); // 주문 배송 수행... // 알림이 전송되지 않았는지 확인... Notification::assertNothingSent(); // 주어진 사용자에게 알림이 전송되었는지 확인... Notification::assertSentTo( [$user], OrderShipped::class ); // 알림이 전송되지 않았는지 확인... Notification::assertNotSentTo( [$user], AnotherNotification::class ); // 주어진 횟수만큼 알림이 전송되었는지 확인... Notification::assertCount(3); }}
assertSentTo 또는 assertNotSentTo 메서드에 클로저를 전달하여 지정된 "진실 테스트"를 통과하는 알림이 전송되었는지 확인할 수 있습니다. 주어진 진실 테스트를 통과하는 알림이 하나 이상 전송되면 어설션이 성공합니다.
Notification::assertSentTo( $user, function (OrderShipped $notification, array $channels) use ($order) { return $notification->order->id === $order->id; });
주문형 알림
테스트하는 코드가 주문형 알림을 보내는 경우, assertSentOnDemand 메서드를 통해 주문형 알림이 전송되었는지 테스트할 수 있습니다.
Notification::assertSentOnDemand(OrderShipped::class);
assertSentOnDemand 메서드에 두 번째 인수로 클로저를 전달하여 주문형 알림이 올바른 "경로" 주소로 전송되었는지 확인할 수 있습니다.
Notification::assertSentOnDemand( OrderShipped::class, function (OrderShipped $notification, array $channels, object $notifiable) use ($user) { return $notifiable->routes['mail'] === $user->email; });
알림 이벤트
알림 전송 이벤트
알림이 전송될 때 알림 시스템에서 Illuminate\Notifications\Events\NotificationSending 이벤트가 디스패치됩니다. 여기에는 "알림 가능" 엔터티와 알림 인스턴스 자체가 포함됩니다. 애플리케이션 내에서 이 이벤트에 대한 이벤트 리스너를 만들 수 있습니다.
use Illuminate\Notifications\Events\NotificationSending; class CheckNotificationStatus{ /** * 주어진 이벤트를 처리합니다. */ public function handle(NotificationSending $event): void { // ... }}
NotificationSending 이벤트에 대한 이벤트 리스너가 handle 메서드에서 false를 반환하면 알림이 전송되지 않습니다.
/** * 주어진 이벤트를 처리합니다. */public function handle(NotificationSending $event): bool{ return false;}
이벤트 리스너 내에서 이벤트의 notifiable, notification 및 channel 속성에 접근하여 알림 수신자 또는 알림 자체에 대한 자세한 정보를 얻을 수 있습니다.
/** * 주어진 이벤트를 처리합니다. */public function handle(NotificationSending $event): void{ // $event->channel // $event->notifiable // $event->notification}
알림 전송됨 이벤트
알림이 전송되면 알림 시스템에서 Illuminate\Notifications\Events\NotificationSent 이벤트가 디스패치됩니다. 여기에는 "알림 가능" 엔터티와 알림 인스턴스 자체가 포함됩니다. 애플리케이션 내에서 이 이벤트에 대한 이벤트 리스너를 만들 수 있습니다.
use Illuminate\Notifications\Events\NotificationSent; class LogNotification{ /** * 주어진 이벤트를 처리합니다. */ public function handle(NotificationSent $event): void { // ... }}
이벤트 리스너 내에서 이벤트의 notifiable, notification, channel 및 response 속성에 접근하여 알림 수신자 또는 알림 자체에 대한 자세한 정보를 얻을 수 있습니다.
/** * 주어진 이벤트를 처리합니다. */public function handle(NotificationSent $event): void{ // $event->channel // $event->notifiable // $event->notification // $event->response}
사용자 정의 채널
Laravel은 몇 가지 알림 채널을 제공하지만 다른 채널을 통해 알림을 전달하기 위해 고유한 드라이버를 작성할 수 있습니다. Laravel은 이를 간단하게 만듭니다. 시작하려면 send 메서드를 포함하는 클래스를 정의합니다. 이 메서드는 두 개의 인수를 받아야 합니다: $notifiable 및 $notification.
send 메서드 내에서 알림의 메서드를 호출하여 채널에서 이해하는 메시지 객체를 검색한 다음 원하는 방식으로 알림을 $notifiable 인스턴스로 보낼 수 있습니다.
<?php namespace App\Notifications; use Illuminate\Notifications\Notification; class VoiceChannel{ /** * 주어진 알림을 보냅니다. */ public function send(object $notifiable, Notification $notification): void { $message = $notification->toVoice($notifiable); // $notifiable 인스턴스로 알림을 보냅니다... }}
알림 채널 클래스가 정의되면 알림의 via 메서드에서 클래스 이름을 반환할 수 있습니다. 이 예에서 알림의 toVoice 메서드는 음성 메시지를 나타내기 위해 선택한 객체를 반환할 수 있습니다. 예를 들어 이러한 메시지를 나타내기 위해 고유한 VoiceMessage 클래스를 정의할 수 있습니다.
<?php namespace App\Notifications; use App\Notifications\Messages\VoiceMessage;use App\Notifications\VoiceChannel;use Illuminate\Bus\Queueable;use Illuminate\Contracts\Queue\ShouldQueue;use Illuminate\Notifications\Notification; class InvoicePaid extends Notification{ use Queueable; /** * 알림 채널을 가져옵니다. */ public function via(object $notifiable): string { return VoiceChannel::class; } /** * 알림의 음성 표현을 가져옵니다. */ public function toVoice(object $notifiable): VoiceMessage { // ... }}