How to queue Laravel 5.7 “email verification” email sending

无人久伴 提交于 2020-01-02 08:14:14

问题


Laravel 5.7 included "email verification" feature works well but not async email sending (during user register or resend link page) is not ideal.

Is there any way to send the email verification email through a queue without rewrite whole email verification in Laravel 5.7 ?


回答1:


Yes! It's possible. And to do that you will have to rewrite the sendEmailVerificationNotification in your App\User. This method is provide by the Illuminate\Auth\MustVerfiyEmail trait. The method sendEmailVerificationNotification notify the created user by sending an Email as define in the Illuminate\Auth\Notifications\VerifyEmail Notification class.

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

You can change this method to not notify directly the user. You will have to define a Job which you will dispath in the sendEmailVerificationNotification method instead of notifying the created user.

In the Job class which you will create in it handle method you can send the email to the user but you must provide the $user to the Job which can be perform by passing it as a parameter to the dispatch method like this

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

$this in the method represent the created user and the App\Jobs\VerififyEmail job which you will create will receive all the parameters pass to the dispatch in it __construct

The code of the VerifyEmail will look like this

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);
    }
}



回答2:


There is no built in way, but you can do it easily by extending and overriding.

First, create a new notification that extends the built-in notification, and also implements the ShouldQueue contract (to enable queuing). The following class assumes you create a notification at 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.
}

Now you need to tell the framework to use your custom notification instead of the default one. You do this by overriding the sendEmailVerificationNotification() on your User model. This simply changes which notification gets sent out.

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



回答3:


My solution is for if you gonna register a user manually in the controller. Laravel already created the Registered event and its listener SendEmailVerificationNotification.

-first configure queue in application in .env file update QUEUE_CONNECTION=database. for more queue documentation read https://laravel.com/docs/6.x/queues

  • publish queue table by php artisan queue:table

  • php artisan migrate

  • php artisan make:job EmailVerificationJob

  • in EmailVerificationJob.php add public variable

    public $user;

  • in EmailVerificationJob.php constructor

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

  • in EmailVerificationJob.php handle function write event(new Registered($this->user)).

  • in your controller if user created successfully add this code for job to work.

    EmailVerificationJob::dispatch($user) ->delay(now()->addSeconds(5)); here job delay for 5 seconds.

  • at the end you must start queue worker php artisan queue:work --tries=3 . here tries means how many times queue should try the job.




回答4:


The solution is pretty simple:

Steps:

  1. Configure Queue Driver

  2. Go To --> Illuminate\Auth\Notifications\VerifyEmail

  3. Implement 'ShouldQueue' interface and add a trait 'Queueable' on above mentioned class i.e. 'VerifyEmail' like this:

class VerifyEmail extends Notification implements ShouldQueue{ use Queueable;

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

3.That's it

Path of interface & trait: use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Bus\Queueable;

Please check the docs too: https://laravel.com/docs/5.7/notifications#queueing-notifications



来源:https://stackoverflow.com/questions/52644934/how-to-queue-laravel-5-7-email-verification-email-sending

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!