[Laravel]パスワードリセットのメール送信をカスタマイズする

広告Laravel
2024年7月1日

Laravel のパスワードリセットPassword::sendResetLink を利用してパスワードリセットメールを送信する機能でメールをカスタマイズする方法です。

パスワードリンク送信処理

Authenticatableを適用したUserモデルにsendPasswordResetNotificationメソッド追加し、 Password::sendResetLink で処理するsendPasswordResetNotificationをオーバーライドします。

use App\Notifications\CustomPasswordResetNotification;
 
class User extends Authenticatable
{
    use Notifiable;
    ・・・
 
    public function sendPasswordResetNotification($token)
    {
        $this->notify(new CustomPasswordResetNotification($token));
    }
}

これでPassword::sendResetLinkを実行するとCustomPasswordResetNotificationの内容でメールが送信されます。

use Illuminate\Support\Facades\Password;
・・・
 $status = Password::sendResetLink(['email' => $email]);

メールのカスタマイズ

CustomPasswordResetNotificationの作成例です。

php artisan make:notification CustomPasswordResetNotification
use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Notifications\Notification;
use Illuminate\Support\Facades\Lang;
 
class CustomPasswordResetNotification extends Notification
{
    public $token;
 
    public function __construct($token)
    {
        $this->token = $token;
    }
 
    public function via($notifiable)
    {
        return ['mail'];
    }
 
    public function toMail($notifiable)
    {
        return (new MailMessage)
            ->subject(Lang::get('パスワードのリセット'))
            ->action(Lang::get('パスワードリセット'), url(config('app.url').route('password.reset', ['token' => $this->token, 'email' => $notifiable->getEmailForPasswordReset()], false)))
            ->line(Lang::get('リンクの有効期限は :count 分です.', ['count' => config('auth.passwords.'.config('auth.defaults.passwords').'.expire')]))
    }
}