へー、新しい投稿があったときにEメールを送る機能を実装するんだ
通知を送る方法としてEメール,SNS, Slackに対応しているようです。.
Creating the notification
$php artisan make:notification NewChirp
app/Notifications/NewChirp.phpが生成されました。
NewChirp.phpのtoMail()メソッドを修正します。
Creating an event
$php artisan make:event ChirpCreated
ChirpCreated.phpのコンストラクタを修正します。
Dispatching the event
app/Models/Chirp.phpを修正します。
Chirpが生成されるたびにイベント:ChirpCreatedも生成されます。
Creating an event listener
EventとListenerの関係が良く分からないのでぐぐってみました。
イベント
何らかの処理をきっかけにイベントを発行します。
イベントを生成するだけで実際の処理をするわけではありません。
リスナー
イベントの発生を監視していて、実際の処理を行うのはリスナー、今回だと通知を送る処理ですね。
イベント毎にリスナーを作成します。
これを読めばLaravelのイベントとリスナーが設定できる
Laravelでイベントとリスナーを使ってみる
$php artisan make:listener SendChirpCreatedNotifications --event=ChirpCreated
app/Listeners/SendChirpCreatedNotifications.phpが生成されました。
イベント:ChirpCreatedに対してリスナーを作成するということですね。
handle()メソッドで、自分以外の全てを対象にするようにループして通知を送るようにしているようです。
ループ内ではcursorを使ってDBから対象を取得していますが、これは一度に全てのユーザをロードすることを回避するためだそうです。
ぐぐるとcursorとchunkがあり、一度にデータを取得せず小分けにしてメモリの消費量を抑えるためのもののようです。
Registering the event listener
イベントリスナーの登録
?リスナーを作っただけでは駄目で登録が必要なようです。
App/Providers/EventServiceProvider.php
EventServiceProvider.phpは最初から存在しています。
EventServiceProvider クラスの$listenにイベントとリスナーを登録します。
実際に投稿してその他のユーザに通知を送信するか試します。
受け取るには本人以外のユーザが必要なのでユーザを新規に登録します。
後はメール送信環境
ドキュメントでは MailHogが推奨されています。Laravel Sailの環境であれば含まれているようです。
MailHogでぐぐるとDockerの環境で使う話ばかり出てきます。
うーん、めんどいのでクラウドで使うサービスを使うことにします。
MailTrapを使ってみます。
https://mailtrap.io/
Sign up for freeを押して情報入力します。
届いたメールのリンクを押下したら、入力したアカウントでログインします。
送信メールを送信するための設定に関して
左のメニューのEmail Testing→Inboxesをクリックします。
画面にInboxesが表示されるのでMy Inboxをクリックします。
SMTP Settingsが表示されます。
Integrationsのドロップダウンで「Laravel 7+」を選択します。
Laravel用のSMTP設定が表示されます。
表示内容をLaravelプロジェクトの.envファイルに反映します。
反映前 |
反映後 |
現在ユーザAとBが存在する状態です。
ユーザAでログインして投稿を行います。
ユーザBに対して通知メールが送信されるはずです。
MailTrap上で想定したメールが送信されたことが確認できました。
では次のチャプターに行きましょう
Continue to learn about deploying your application...
0 件のコメント:
コメントを投稿