Ссылка для проверки электронной почты Laravel с использованием localhost в производстве

Я долго боролся с проблемой и не нашел решения. Я использую 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), чтобы изменить генерацию ссылки. Потому что нет публикации у поставщика.

Пожалуйста помоги.

Проверьте APP_URL в вашем файле .env. Скорее всего, там все еще написано localhost

aynber 13.03.2024 19:02

@aynber Нет, это правильно, потому что, как я уже говорил, это работает, если делать это вручную; только когда это делается автоматически, это не работает. Тем более, я это уже проверил.

Jovany González 13.03.2024 19:28

Его сложно отлаживать с помощью такого маленького кода. Может быть, попробовать также очистить кеш маршрутов? Вы искали «localhost»?

Alex 14.03.2024 11:54
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
3
210
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Когда уведомление отправляется в первый раз, оно не берет его из .env, а интерпретирует из входящего запроса, чтобы его решить, мне пришлось сделать следующее:

  1. Создайте новое уведомление: php artisan make:notification VerifyEmail

  2. Расширьте оригинал в Illuminate\Auth\Notifications\VerifyEmail

  3. Перезапишите родительскую функцию, которая создает 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()),
            ]
        );
    }
}

  1. В 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-адреса, я не знаю, хорошая ли это идея, потому что я читал, что он может делать некоторые странные вещи, но на данный момент я не наблюдаю какого-либо неподобающего поведения.

Другие вопросы по теме