環境: Laravel 9 / PHP 8.2
認証ライブラリ: "laravel/fortify" (今回は関係ないけど一応)
1.まずメール認証の準備
詳しくはこちら
モデルの準備 | Laravel 9.x メール確認
その他、認証のためのイベントトリガーとかまわりは省略。
<?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
を作成
<?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に戻ってきて
<?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
たどり着くまでに
認証メールをカスタムするところで、キューに入れれないかと四苦八苦していた
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