최신판 |
당신의 편집 |
106번째 줄: |
106번째 줄: |
|
| |
|
| ==이벤트 디스패치하기== | | ==이벤트 디스패치하기== |
| 이제 이벤트 클래스를 가지고 있으니 Chirp가 생성될 때마다 [[Laravel 이벤트#이벤트 디스패치하기|이벤트를 디스패치]]할 준비가 되었습니다. 애플리케이션의 라이프사이클 어디에서나 이벤트를 디스패치할 수 있지만, 우리의 이벤트는 Eloquent 모델의 생성과 관련이 있으므로 <code>Chirp</code> 모델이 이벤트를 디스패치하도록 설정할 수 있습니다.
| |
|
| |
| {{소스헤더|app/Models/Chirp.php}}
| |
| <syntaxhighlight lang='php' highlight='5,18-20'>
| |
| <?php
| |
|
| |
| namespace App\Models;
| |
|
| |
| use App\Events\ChirpCreated;
| |
| use Illuminate\Database\Eloquent\Factories\HasFactory;
| |
| use Illuminate\Database\Eloquent\Model;
| |
| use Illuminate\Database\Eloquent\Relations\BelongsTo;
| |
|
| |
| class Chirp extends Model
| |
| {
| |
| use HasFactory;
| |
|
| |
| protected $fillable = [
| |
| 'message',
| |
| ];
| |
|
| |
| protected $dispatchesEvents = [
| |
| 'created' => ChirpCreated::class,
| |
| ];
| |
|
| |
| public function user(): BelongsTo
| |
| {
| |
| return $this->belongsTo(User::class);
| |
| }
| |
| }
| |
| </syntaxhighlight>
| |
|
| |
| 이제 새로운 <code>Chirp</code>가 생성될 때마다 <code>ChirpCreated</code> 이벤트가 디스패치될 것입니다.
| |
|
| |
| ==이벤트 리스너 생성하기== | | ==이벤트 리스너 생성하기== |
| 이제 이벤트를 디스패치하고 있으므로, 해당 이벤트를 청취하여 알림을 보내는 리스너를 만들어 보겠습니다.
| |
|
| |
| <code>ChirpCreated</code> 이벤트에 구독하는 리스너를 생성합니다:
| |
|
| |
| <syntaxhighlight lang='bash'>
| |
| php artisan make:listener SendChirpCreatedNotifications --event=ChirpCreated
| |
| </syntaxhighlight>
| |
|
| |
| 새로운 리스너는 <code>app/Listeners/SendChirpCreatedNotifications.php</code>에 위치하게 됩니다. 이 리스너를 업데이트하여 알림을 보내도록 하겠습니다.
| |
|
| |
| {{소스헤더|app/Listeners/SendChirpCreatedNotifications.php}}
| |
| <syntaxhighlight lang='php' highlight='6,7,11,20-22'>
| |
| <?php
| |
|
| |
| namespace App\Listeners;
| |
|
| |
| use App\Events\ChirpCreated;
| |
| use App\Models\User;
| |
| use App\Notifications\NewChirp;
| |
| use Illuminate\Contracts\Queue\ShouldQueue;
| |
| use Illuminate\Queue\InteractsWithQueue;
| |
|
| |
| class SendChirpCreatedNotifications implements ShouldQueue
| |
| {
| |
| ...
| |
| /**
| |
| * Handle the event.
| |
| */
| |
| public function handle(ChirpCreated $event): void
| |
| {
| |
| // 이벤트 처리
| |
| foreach (User::whereNot('id', $event->chirp->user_id)->cursor() as $user) {
| |
| $user->notify(new NewChirp($event->chirp));
| |
| }
| |
| }
| |
| }
| |
| </syntaxhighlight>
| |
|
| |
| 리스너에 <code>ShouldQueue</code> 인터페이스를 지정하여, 리스너가 [[Laravel 큐|큐]]에서 실행되도록 Laravel에 알려줍니다. 기본적으로 "database" 큐가 사용되어 작업이 비동기적으로 처리됩니다. 큐에 작업을 처리하려면 터미널에서 <code>php artisan queue:work</code> Artisan 명령어를 실행해야 합니다.
| |
|
| |
| 또한, 모든 플랫폼 사용자에게 알림을 보내도록 리스너를 구성했으며, Chirp 작성자는 제외했습니다. 실제로는 이로 인해 사용자가 불편할 수 있으므로, 팔로우한 계정에 대해서만 알림을 받도록 하는 "팔로우" 기능을 구현하는 것이 좋습니다.
| |
|
| |
| 모든 사용자를 한 번에 메모리에 로드하지 않기 위해 [[Laravel Eloquent#커서|데이터베이스 커서]]를 사용했습니다.
| |
|
| |
| {{NOTE}}
| |
| 프로덕션 애플리케이션에서는 사용자가 이러한 알림을 구독 해지할 수 있는 기능을 추가해야 합니다.
| |
| {{/NOTE}}
| |
|
| |
| ==테스트하기== | | ==테스트하기== |
| 애플리케이션에서 전송된 이메일을 확인하기 위해 [[Mailpit]]과 [[HELO]] 같은 로컬 이메일 테스트 도구를 사용할 수 있습니다. Docker와 Laravel Sail을 사용하여 개발 중이라면 Mailpit이 포함되어 있습니다.
| |
|
| |
| 대안으로, 프로젝트의 <code>.env</code> 파일을 편집하여 <code>MAIL_MAILER</code> 환경변수를 <code>log</code>로 변경하면 Laravel이 이메일을 로그 파일에 작성하도록 설정할 수 있습니다. 기본적으로 이메일은 <code>storage/logs/laravel.log</code> 파일에 기록됩니다.
| |
|
| |
| 알림이 Chirp 작성자에게 전송되지 않도록 설정했으므로, 두 개 이상의 사용자 계정을 등록하십시오. 그런 다음 새 Chirp를 게시하여 알림을 트리거하세요.
| |
|
| |
| Mailpit을 사용 중이라면 http://localhost:8025/ 로 이동하여 방금 게시한 메시지에 대한 알림을 찾을 수 있습니다!
| |
|
| |
| [[파일:mailpit.png|640px]]
| |
|
| |
| ===프로덕션에서 이메일 보내기=== | | ===프로덕션에서 이메일 보내기=== |
| 프로덕션 환경에서 실제 이메일을 전송하려면 SMTP 서버 또는 Mailgun, Postmark, Amazon SES와 같은 트랜잭셔널 이메일 제공자가 필요합니다. Laravel은 이러한 모든 제공자를 기본적으로 지원합니다. 자세한 내용은 [[Laravel 메일#소개|Mail 문서]]를 참조하십시오.
| |