ローカル環境(XAMPP)でLaravelアプリを製作中の話。
Laravelアプリに認証機能を付けてパスワードリセットを試しに使ってみたところ、以下の通りGメールを利用してメールを送信することはできた。
LaravelでGメールを送信する方法。アプリパスワードを取得すればOK。
しかし、届いたメール内のリンクをクリックすると”Object not found!”と表示されてパスワードリセットの手続きを進めることができなくなった。
よくよく調べてみると、本来URLは”localhost:8000/…”のようにポート番号を含めた形でなければいけないのに”localhost/…”のようにポート番号なしとなっていた。
解決方法は.envのAPP_URLにポート番号を足すだけ。
.env
# 変更前
# APP_URL=http://localhost
# 変更後(ポート番号を記載)
APP_URL=http://localhost:8000
なぜこれで解決するかというと、パスワードリセットメールのリンクのURLを作る際に.envのAPP_URLを使っているから。
vender/laravel/framework/src/Illuminate/Auth/NotificationsResetPassword.php
// パスワードリセット機能の大元である"ForgotPasswordController.php"から辿っていけば
// このファイル(NotificationsResetPassword.php)に辿り着ける。
public function toMail($notifiable)
{
// 略
return (new MailMessage)
// 略
// config('app.url')で.envのAPP_URLを呼び出している
->action(Lang::get('Reset Password'),
url(config('app.url').route('password.reset',
['token' => $this->token,
'email' => $notifiable->getEmailForPasswordReset()],
false)))
// 略
}
これでパスワードリセットのメール内のURLも”localhost:8000/…”となり、クリックしたときにパスワードリセットのページが表示されるようになった。