🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

メール

メールは、コンピュータネットワークを利用し、 情報等を交換する手段のことです。

Q&A

解決済

1回答

1068閲覧

laravel8(inertia)での非同期メール認証

mentanpinsan

総合スコア23

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

メール

メールは、コンピュータネットワークを利用し、 情報等を交換する手段のことです。

0グッド

0クリップ

投稿2021/01/20 14:33

###前提条件
windows10でdockerを使っています。コンテナの80番ポートを10080番ポートにマウントしています。

発生している問題・エラーメッセージ

送られてきたメールのVerify Email Adress ボタンをクリックすると404 not found。 urlは以下のようになっています。

http://localhost/email/verify/1/a6ad00ac113a19d953efb91820d8788e2263b28a?expires=1611154077&signature=3031b6d59db766e85353cf67c980b3fcfa0f013953d566fbe5fc031f1bb239cd

非同期にしなければ問題なくクリックできてemail_verify_atにデータが入ります。そのときのurlは以下のようになっています。

http://localhost:10080/email/verify/2/e5e5bab35e96c139710bfc3657a8d62a1d67ab7d?expires=1611155302&signature=ad2936cb8fc16af119f7e45ec6542d6a64b044eea2cce240d9a554b7bdc6e125

ポート番号が入っていないから404になると思うのですがなぜ非同期にすると違うurlが生成されるのかがわかりません。
url生成部分のコードは以下のようになっています。
verification.verifyが変わっている?

php

1namespace Illuminate\Auth\Notifications; 2 3 4class VerifyEmail extends Notification 5{ 6 7........ 8 9protected function verificationUrl($notifiable) 10 { 11 if (static::$createUrlCallback) { 12 return call_user_func(static::$createUrlCallback, $notifiable); 13 } 14 15 return URL::temporarySignedRoute( 16 'verification.verify', 17 Carbon::now()->addMinutes(Config::get('auth.verification.expire', 60)), 18 [ 19 'id' => $notifiable->getKey(), 20 'hash' => sha1($notifiable->getEmailForVerification()), 21 ] 22 ); 23 } 24 25........ 26 27}

以下は非同期にするために書き換えたコードです。

非同期のソースコード

php

1php artisan make:job QueuedVerifyEmailJob

php

1<?php 2 3namespace App\Jobs; 4 5use Illuminate\Bus\Queueable; 6use Illuminate\Contracts\Queue\ShouldBeUnique; 7use Illuminate\Contracts\Queue\ShouldQueue; 8use Illuminate\Foundation\Bus\Dispatchable; 9use Illuminate\Queue\InteractsWithQueue; 10use Illuminate\Queue\SerializesModels; 11use Illuminate\Auth\Notifications\VerifyEmail; 12use App\Models\User; 13 14class QueuedVerifyEmailJob implements ShouldQueue 15{ 16 use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; 17 18 /** 19 * Create a new job instance. 20 * 21 * @return void 22 */ 23 protected $user; 24 25 public function __construct(User $user) 26 { 27 $this->user = $user; 28 } 29 30 /** 31 * Execute the job. 32 * 33 * @return void 34 */ 35 public function handle() 36 { 37 $this->user->notify(new VerifyEmail); 38 } 39} 40

php

1<?php 2 3namespace App\Models; 4 5use Illuminate\Contracts\Auth\MustVerifyEmail; 6use Illuminate\Database\Eloquent\Factories\HasFactory; 7use Illuminate\Foundation\Auth\User as Authenticatable; 8use Illuminate\Notifications\Notifiable; 9use Laravel\Fortify\TwoFactorAuthenticatable; 10use Laravel\Jetstream\HasProfilePhoto; 11use Laravel\Sanctum\HasApiTokens; 12use App\Jobs\QueuedVerifyEmailJob; 13 14class User extends Authenticatable implements MustVerifyEmail 15{ 16 use HasApiTokens; 17 use HasFactory; 18 use HasProfilePhoto; 19 use Notifiable; 20 use TwoFactorAuthenticatable; 21 22 /** 23 * The attributes that are mass assignable. 24 * 25 * @var array 26 */ 27 protected $fillable = [ 28 'name', 29 'email', 30 'password', 31 ]; 32 33 /** 34 * The attributes that should be hidden for arrays. 35 * 36 * @var array 37 */ 38 protected $hidden = [ 39 'password', 40 'remember_token', 41 'two_factor_recovery_codes', 42 'two_factor_secret', 43 ]; 44 45 /** 46 * The attributes that should be cast to native types. 47 * 48 * @var array 49 */ 50 protected $casts = [ 51 'email_verified_at' => 'datetime', 52 ]; 53 54 /** 55 * The accessors to append to the model's array form. 56 * 57 * @var array 58 */ 59 protected $appends = [ 60 'profile_photo_url', 61 ]; 62 63 public function sendEmailVerificationNotification() 64 { 65 //dispactches the job to the queue passing it this User object 66 QueuedVerifyEmailJob::dispatch($this); 67 } 68}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

AbeTakashi

2021/01/20 15:00

正直なところこの不具合の理由は分からないのですが、非同期処理あるあるの罠として、ソースコードやconfigを変更してもプログラムがいったんメモリに格納されてたりするとその変更が反映されない場合があります。Dockerの場合はいったんコンテナをまるっと再起動してみるといいかもしれません。見当違いならごめんなさい。
kai0310

2021/01/20 15:25 編集

キューとジョブで行った際の再現を追記してください
guest

回答1

0

ベストアンサー

非同期時には.envのAPP_URLが使われるのでここを合わせればいい。

APP_URL=http://localhost:10080

投稿2021/01/20 22:30

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mentanpinsan

2021/01/21 03:05

ありがとうございました。無事解決しました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問