Laravelにおいてメール送信を通知として実装する理由
目次
メール送信よく使いますよね
お問い合わせフォームだと送信者に内容確認、管理者宛にはお問い合わせがあった旨を送信するメールが、予約フォームの場合も同様に双方にメール送信が必要ですよね。
Laravelではこれらのメール送信に通知機能(Notification)をよく使用します。
単純にメール送信で実装してもいいんじゃないか?と思う方もいらっしゃるでしょう。
Laravelでメールを送信する方法
Laravelでは以下のパターンでメールを送信することが出来ます。
- Mailファサードを利用する
- Mailableを利用する(Illuminate\Mail\Mailable)
- Notification(通知)を利用する
通知機能を利用する訳
Laravelの通知機能はメールだけのものではありません。
- マイページの通知アイコンに未読通知の件数を表示する
- 通知内容をDBに保存する
- SlackやChatworkなどの外部ツールに通知する
- 通知を配列として受け取る
複数のパターンに対応するため、ベースの通知機能を以下のように作成しておきます。
class BaseNotification extends Notification
{
use Queueable;
public $resource;
public function __construct( $resource )
{
$this->resource = $resource;
}
public function via($notifiable)
{
$channels = [DatabaseChannel::class];
if(isset($notifiable->notifications['email'])){
$channels[] = 'mail';
}
if(isset($notifiable->notifications['chat_work'])){
$channels[] = ChatWorkChannel::class;
}
return $channels;
}
public function toArray($notifiable)
{
return [
//
];
}
public function toChatWork($notifiable)
{
$message = $this->getMessage($notifiable);
$this->sendChatWork($notifiable, $message);
return [];
}
public function sendChatWork($notifiable, $message): void
{
$params = ['body' => $message];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://api.chatwork.com/v2/rooms/' . $notifiable->notifications['chat_work_room_id'] . '/messages');
curl_setopt($ch, CURLOPT_HTTPHEADER, ['X-ChatWorkToken: '. Crypt::decrypt($notifiable->notifications['chat_work_api_key'])]);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params, '', '&'));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_exec($ch);
curl_close ($ch);
}
public function getMessage($notifiable){
return '';
}
※メールの通知は別途定義しています。
実際の通知処理を実行する対象(ユーザなど)のモデルにはNotifiableトレイトを追加してください。
class AdminUser extends Authenticatable
{
use HasFactory;
use SoftDeletes;
use Notifiable; #通知用トレイト
パスワードリセット時に通知を送るサンプル
$admin_user->notify(new PasswordResetNotification(''));
PasswordResetNotificationは先ほどのBaseNotificationを継承したものです。
さてこのように作成したシステムですが、現状通知をメールで受け取っているがChatworkでも通知して欲しいという依頼があった場合に、単純にメール機能だけで実装していると別途ChatworkのAPIと連携する処理が必要になります。
ただ、このようにあらかじめ通知機能を想定して実装しておけば、ユーザのAPIキーを保存できる機能だけ追加することで新しい通知を実装することが可能です。
また、1回の通知で複数箇所への同時通知も実現可能になります。
要は拡張性が非常に高くなるんです。
あらかじめ複数の通知先(チャンネル)を想定可能な通知機能を利用するのがオススメです。



















