Blade로 Chirper 구축 - 알림 및 이벤트 편집하기

경고: 로그인하지 않았습니다. 편집을 하면 IP 주소가 공개되게 됩니다. 로그인하거나 계정을 생성하면 편집자가 사용자 이름으로 기록되고, 다른 장점도 있습니다.

편집을 취소할 수 있습니다. 이 편집을 되돌리려면 아래의 바뀐 내용을 확인한 후 게시해주세요.

최신판 당신의 편집
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 문서]]를 참조하십시오.

제타위키에서의 모든 기여는 크리에이티브 커먼즈 저작자표시-동일조건변경허락 3.0 라이선스로 배포된다는 점을 유의해 주세요(자세한 내용에 대해서는 제타위키:저작권 문서를 읽어주세요). 만약 여기에 동의하지 않는다면 문서를 저장하지 말아 주세요.
또한, 직접 작성했거나 퍼블릭 도메인과 같은 자유 문서에서 가져왔다는 것을 보증해야 합니다. 저작권이 있는 내용을 허가 없이 저장하지 마세요!

취소 편집 도움말 (새 창에서 열림)

이 문서에서 사용한 틀:

이 문서는 다음의 숨은 분류 1개에 속해 있습니다: