Как поставить в очередь Laravel 5.7 "подтверждение адреса электронной почты"

Включенная в Laravel 5.7 функция «проверки электронной почты» работает хорошо, но асинхронная отправка электронной почты (во время регистрации пользователя или страницы повторной отправки ссылки) не идеальна.

Есть ли способ отправить электронное письмо с подтверждением электронной почты через очередь без перезаписи всей проверки электронной почты в Laravel 5.7?

Я не думаю, что на данный момент это возможно. Новый признак отправляет это письмо, который в настоящее время не может быть поставлен в очередь.

Jerodev 04.10.2018 13:12
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
6
1
6 378
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Да! Возможно. И для этого вам нужно будет перезаписать sendEmailVerificationNotification в вашем App\User. Этот метод обеспечивается признаком Illuminate\Auth\MustVerfiyEmail. Метод sendEmailVerificationNotification уведомляет созданный user, отправляя электронное письмо, как определено в классе уведомлений Illuminate\Auth\Notifications\VerifyEmail.

// This is the code defined in the sendEmailVerificationNotification
public function sendEmailVerificationNotification()
{
    $this->notify(new Notifications\VerifyEmail);
}

Вы можете изменить этот метод, чтобы не уведомлять пользователя напрямую. Вам нужно будет определить Job, который вы будете отправлять в методе sendEmailVerificationNotification вместо уведомления созданного пользователя.

В классе Job вы создадите метод handle, в котором вы можете отправить электронное письмо на user, но вы должны предоставить $user в задание, которое можно выполнить, передав его в качестве параметра методу dispatch следующим образом:

public function sendEmailVerificationNotification()
{
    VerifyEmail::dispatch($this);
}

$this представляет собой созданный user, и задание App\Jobs\VerififyEmail (которое вы создадите) получит все параметры, переданные в dispatch в его __construct.

Код VerifyEmail будет выглядеть так:

namespace App\Jobs;

use App\User;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Auth\Notifications\VerifyEmail;

class VerifyEmail implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    protected $user;

    public function __construct(User $user)
    {
        $this->user = $user;
    }

    public function handle()
    {
        // Here the email verification will be sent to the user
        $this->user->notify(new VerifyEmail);
    }
}

спасибо за ответ, работает! просто пришлось переименовать класс Job QueuedVerifyEmail из-за двойного объявления имени класса.

François 04.10.2018 15:04

Добро пожаловать. Даже если оба класса имеют одинаковое имя, потому что они находятся в разных пространствах имен App\Jobs\VerifyEmail и Illuminate\Auth\Notification\VerifyEmail, это не вызовет никаких проблем.

Yves Kipondo 04.10.2018 15:09

Вы могли бы использовать то же имя класса, присвоив классу Laravel другое имя, например use Illuminate\Auth\Notifications\VerifyEmail as VerifyEmailNotification;, и в методе handle$this->user->notify(new VerifyEmailNotification);. На мой взгляд, это немного чище, но это просто придирки.

Ben V. 22.03.2019 17:04
Ответ принят как подходящий

Нет встроенного способа, но вы можете легко это сделать, расширив и переопределив.

Сначала создайте новое уведомление, которое расширяет встроенное уведомление, а также реализует контракт ShouldQueue (для включения очереди). В следующем классе предполагается, что вы создали уведомление на app/Notifications/VerifyEmailQueued.php:

namespace App\Notifications;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Auth\Notifications\VerifyEmail;

class VerifyEmailQueued extends VerifyEmail implements ShouldQueue
{
    use Queueable;

    // Nothing else needs to go here unless you want to customize
    // the notification in any way.
}

Теперь вам нужно указать фреймворку использовать ваше настраиваемое уведомление вместо уведомления по умолчанию. Вы делаете это путем перезаписи sendEmailVerificationNotification() на вашей модели User. Это просто меняет тип отправляемого уведомления.

public function sendEmailVerificationNotification()
{
    $this->notify(new \App\Notifications\VerifyEmailQueued);
}

Работал как мультик!

Mfoo 27.11.2018 19:12

это намного проще, чем принятый ответ, и он работает

AaronHS 15.02.2019 15:25

Это работает, но при нажатии на ссылку подтверждения (отправленную по электронной почте) происходит перенаправление на страницу 403, недействительная подпись. (Laravel 6)

Irfan Gondal 27.04.2021 21:45

@IrfanGondal Теперь уведомление будет помещено в очередь, поэтому URL-адрес в уведомлении будет построен с использованием вашего APP_URL в файле среды. Этот APP_URL должен соответствовать окончательному URL-адресу. Так, например, если ваш сайт находится на https, вам необходимо убедиться, что ваш APP_URL также является https.

patricus 28.04.2021 02:28

Решение довольно простое:

Steps:

  1. Настроить драйвер очереди

  2. Перейдите в -> Illuminate \ Auth \ Notifications \ VerifyEmail.

  3. Реализуйте интерфейс ShouldQueue и добавьте черту Queueable в вышеупомянутый класс, например, VerifyEmail, например:

class VerifyEmail extends Notification реализует ShouldQueue { используйте В очереди;

.... .... ... }

3. вот и все

Путь интерфейса и черты: используйте Illuminate \ Contracts \ Queue \ ShouldQueue; используйте Illuminate \ Bus \ Queueable;

Пожалуйста, проверьте также документы: https://laravel.com/docs/5.7/notifications#queueing-notifications

Не лучшая идея изменять классы laravel, поэтому приведенные выше решения предлагают делать это путем расширения и переопределения.

François 28.11.2018 12:09

Не рекомендуется вносить изменения в файлы в папке поставщика laravel, потому что при следующей команде обновления композитора ваши изменения в файлах в папке поставщика будут удалены.

Ozal Zarbaliyev 27.01.2020 09:09

Мое решение - если вы собираетесь вручную регистрировать пользователя в контроллере. Laravel уже создал зарегистрированное событие и его прослушиватель SendEmailVerificationNotification.

-сначала настроить очередь в приложении в обновлении файла .env QUEUE_CONNECTION=database. для получения дополнительной документации по очереди прочтите https://laravel.com/docs/6.x/queues

  • опубликовать таблицу очереди от php artisan queue:table

  • php artisan migrate

  • php artisan make:job EmailVerificationJob

  • в EmailVerificationJob.php добавить общедоступную переменную

    общедоступный пользователь $;

  • в конструкторе EmailVerificationJob.php

    публичная функция __construct (Пользователь $ user) { $ this-> user = $ user; }

  • в функции дескриптора EmailVerificationJob.php напишите event(new Registered($this->user)).

  • в вашем контроллере, если пользователь успешно создал, добавьте этот код для работы.

    EmailVerificationJob :: dispatch ($ пользователь) -> задержка (сейчас () -> addSeconds (5)); здесь задержка задания на 5 секунд.

  • в конце необходимо запустить очередь работника php artisan queue:work --tries=3. здесь пытается означает, сколько раз очередь должна пытаться выполнить задание.

Обновление # 1

это решение я использовал в Laravel 8.

сначала создайте класс уведомлений SendEmailVerificationNotification

php artisan make:notification SendEmailVerificationNotification

Это будет содержимое файла app / Notifications / SendEmailVerificationNotification.php. здесь мы собираемся расширить класс Laravel по умолчанию SendEmailVerificationNotification и реализовать очередь

<?php

namespace App\Notifications;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Notifications\Notification;

class SendEmailVerificationNotification extends \Illuminate\Auth\Listeners\SendEmailVerificationNotification implements ShouldQueue
{
    use Queueable;
}

последний шаг - это редактирование массива $ listen класса EventServiceProvider. Закомментируйте уведомление по умолчанию о зарегистрированном событии и добавьте собственное уведомление, которое мы создали.

use App\Notifications\SendEmailVerificationNotification as QueuedSendEmailVerificationNotification;
use Illuminate\Auth\Events\Registered;
//use Illuminate\Auth\Listeners\SendEmailVerificationNotification;

protected $listen = [
        Registered::class => [
//            SendEmailVerificationNotification::class,
            QueuedSendEmailVerificationNotification::class
        ],

];

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