LoginSignup
1
0

More than 1 year has passed since last update.

メール認証をキューイングして行う

Last updated at Posted at 2023-01-19

環境: Laravel 9 / PHP 8.2
認証ライブラリ: "laravel/fortify" (今回は関係ないけど一応)

1.まずメール認証の準備

詳しくはこちら
モデルの準備 | Laravel 9.x メール確認
その他、認証のためのイベントトリガーとかまわりは省略。

app/Models/User.php
<?php

namespace App\Models;

use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;

class User extends Authenticatable implements MustVerifyEmail
{
    use Notifiable;

    // …
}

2. メール送信時に呼ばれるNotificationsクラスに少し追記する

新しく app/Notifications/VerifyEmailQueued.php を作成

app/Notifications/VerifyEmailQueued.php
<?php

namespace App\Notifications;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Auth\Notifications\VerifyEmail;

class VerifyEmailQueued extends VerifyEmail implements ShouldQueue
{
    /**
     * 本来はVerifyEmailだけで済ませるところキューに乗せて実行したかったことから
     * VerifyEmailを上書きすることで実現している
     */
    use Queueable;
}

3. notify()を実行しているメソッドを上書き

User Modelに戻ってきて

app/Models/User.php
<?php

namespace App\Models;

use App\Notifications\VerifyEmailQueued; // 追加
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;

class User extends Authenticatable implements MustVerifyEmail
{
    use Notifiable;

    /**
     * メール認証メール送信時に呼ばれるメソッド
     * Illuminate\Contracts\Auth\MustVerifyEmailの上書き
     *
     * Notificationのnofifyはqueueもいける
     * @return void
     */
    public function sendEmailVerificationNotification(): void
    {
        $this->notify(new VerifyEmailQueued);
    }

    // …
}

確認) 実行してみる

キューを設定しておいて
ドライバの注意と事前要件 | Laravel 9.x キュー

php artisan queue:work を実行しておいて
新規登録処理をすると

  2023-01-19 14:49:08 App\Notifications\VerifyEmailQueued ........................................................................................... RUNNING
  2023-01-19 14:49:08 App\Notifications\VerifyEmailQueued ...................................................................................... 60.21ms DONE

ちゃんとキューイングされて実行された!やったね

調査の苦労話

結論はこれだったんだけど
https://codeanddeploy.com/blog/laravel/how-to-queue-the-laravel-8-email-verification

たどり着くまでに
認証メールをカスタムするところで、キューに入れれないかと四苦八苦していた

app/Providers/AuthServiceProvider.php
class AuthServiceProvider extends ServiceProvider
{
    public function boot()
    {
        $this->registerPolicies();

        // ここでキューイングできるように返せばいけるのでは?と思ったけど
        // 掘っていくうちに、ここでは最後Mailableのsendしかしてなかったので、ダメじゃんってなった
        VerifyEmailQueued::toMailUsing(function ($notifiable, $url) {
            return (new EmailVerification($notifiable, $url, $referer));
        });
    }

最後に

弊社では、一緒に働いてくれるエンジニアを募集しています。
Laravelをこねこねしましょう!
↓最新技術や自社開発に興味のある方はこちらから↓
Wantedly - スタジオアンビルト株式会社

こんなWebサービスを作っています。
マドリー
Studio Unbuilt

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0