Я долго боролся с проблемой и не нашел решения. Я использую Laravel 9 в производстве, и когда пользователь регистрируется, электронное письмо с подтверждением отправляется автоматически, но по прибытии отображается следующий адрес:
http://localhost/verify-email/3322/45a667c298ca4ffd2d8f3ea002d9a11c4391ff63?expires=1710354098&signature=1ffba796dc8f5368a064f735fce8888f11b9cfd1ca630444283ab11039a8bc00
Автоматическая отправка (первый раз) отправляется с помощью LOCALHOST, но когда пользователь вручную нажимает кнопку повторной отправки, она отправляется ПРАВИЛЬНО.
Я не использую и не настраиваю очереди. Как я могу решить эту проблему?
Я уже пробовал: php artisan optimize:clear
Это моя конфигурация .env.
APP_NAME=somefun
APP_ENV=production
APP_KEY=base64:YUiSMZfKLyWPixk3guHIeYS259kX3FD6Yn82osjIIHI=
APP_DEBUG=false
APP_URL=http://somefun.com.mx
Я не могу найти способ опубликовать файл электронного письма с подтверждением (Illuminate/Auth/Notifications/VerifyEmail.php), чтобы изменить генерацию ссылки. Потому что нет публикации у поставщика.
Пожалуйста помоги.
@aynber Нет, это правильно, потому что, как я уже говорил, это работает, если делать это вручную; только когда это делается автоматически, это не работает. Тем более, я это уже проверил.
Его сложно отлаживать с помощью такого маленького кода. Может быть, попробовать также очистить кеш маршрутов? Вы искали «localhost»?






Когда уведомление отправляется в первый раз, оно не берет его из .env, а интерпретирует из входящего запроса, чтобы его решить, мне пришлось сделать следующее:
Создайте новое уведомление:
php artisan make:notification VerifyEmail
Расширьте оригинал в Illuminate\Auth\Notifications\VerifyEmail
Перезапишите родительскую функцию, которая создает URL-адрес verificationUrl, его копией, но включая новую строку:
Это остается таким:
<?php
namespace App\Notifications;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\URL;
use Illuminate\Support\Facades\Config;
use Illuminate\Auth\Notifications\VerifyEmail as VerifyEmailNotification;
class VerifyEmail extends VerifyEmailNotification
{
/**
* Get the verification URL for the given notifiable.
*
* @param mixed $notifiable
* @return string
*/
protected function verificationUrl($notifiable)
{
if (static::$createUrlCallback) {
return call_user_func(static::$createUrlCallback, $notifiable);
}
URL::forceRootUrl(config('app.url')); //<-------THIS FIXED
return URL::temporarySignedRoute(
'verification.verify',
Carbon::now()->addMinutes(Config::get('auth.verification.expire', 60)),
[
'id' => $notifiable->getKey(),
'hash' => sha1($notifiable->getEmailForVerification()),
]
);
}
}
app\Models\User.php перезапишите функцию типажа, передав ей новый экземпляр нового уведомления:<?php
namespace App\Models;
use Exception;
use Stripe\Account;
use Stripe\StripeClient;
use Laravel\Cashier\Billable;
use Laravel\Sanctum\HasApiTokens;
use App\Notifications\VerifyEmail; //<-------Reference to new notification
use Spatie\Permission\Traits\HasRoles;
use Illuminate\Notifications\Notifiable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable implements MustVerifyEmail
{
use HasApiTokens, Notifiable, HasRoles, Billable;
protected $guarded = [];
//>>>>Overwrite the trait function by passing it a new instance of the new notification<<<<<<<
public function sendEmailVerificationNotification()
{
$this->notify(new VerifyEmail);
}
}
Принудительное использование URL-адреса, я не знаю, хорошая ли это идея, потому что я читал, что он может делать некоторые странные вещи, но на данный момент я не наблюдаю какого-либо неподобающего поведения.
Проверьте APP_URL в вашем файле .env. Скорее всего, там все еще написано localhost