Как поставить в очередь Laravel 5.7 «проверка электронной почты» отправка электронной почты - PullRequest
0 голосов
/ 04 октября 2018

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

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

Ответы [ 3 ]

0 голосов
/ 04 октября 2018

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

Сначала создайте новое уведомление, которое расширяет встроенное уведомление, а также реализует контракт 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);
}
0 голосов
/ 26 ноября 2018

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

Steps:

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

  2. Перейти к -> Подсветка \ Auth \ Notifications \ VerifyEmail

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

Класс VerifyEmail расширяет средства уведомления ShouldQueue {use В очереди ;

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

3. Вот и все

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

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

0 голосов
/ 04 октября 2018

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

// This is the code define 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 inметод представляет созданное 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);
    }
}
...