web-dev-qa-db-fra.com

Comment faire la queue Laravel 5.7 "email vérification" envoi d'email

La fonctionnalité "vérification des e-mails" incluse dans Laravel 5.7 fonctionne bien, mais l'envoi d'e-mails asynchrones (lors de l'enregistrement de l'utilisateur ou de la page de lien renvoyé) n'est pas idéal.

Existe-t-il un moyen d'envoyer le courrier électronique de vérification du courrier électronique via une file d'attente sans réécrire la vérification complète du courrier électronique dans Laravel 5.7?

3
François

Oui! C'est possible. Et pour ce faire, vous devrez réécrire le sendEmailVerificationNotificationdans votre App\User. Cette méthode est fournie par le trait Illuminate\Auth\MustVerfiyEmail. La méthode sendEmailVerificationNotificationinforme le usercréé en envoyant un courrier électronique comme défini dans la classe Illuminate\Auth\Notifications\VerifyEmail Notification. 

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

Vous pouvez modifier cette méthode pour ne pas avertir directement l'utilisateur. Vous devrez définir un Jobque vous dissiperez dans la méthode sendEmailVerificationNotificationau lieu d'avertir l'utilisateur créé.

Dans la classe Jobque vous allez créer dans la méthode handlename__, vous pouvez envoyer l'e-mail à usermais vous devez fournir le $user au Job, en le transmettant en tant que paramètre à la méthode dispatchname__. 

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

$this dans la méthode représente le usercréé et le travail App\Jobs\VerififyEmail que vous allez créer recevra tous les paramètres passés au dispatchdans celui-ci __construct

Le code de VerifyEmailressemblera à ceci

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);
    }
}
5
Yves Kipondo

Il n'y a pas de chemin intégré, mais vous pouvez le faire facilement en l'étendant et en le dépassant.

Commencez par créer une nouvelle notification qui étend la notification intégrée et implémente également le contrat ShouldQueue (pour activer la mise en file d'attente). La classe suivante suppose que vous créez une notification à 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.
}

Maintenant, vous devez indiquer au framework d’utiliser votre notification personnalisée au lieu de celle par défaut. Vous faites cela en remplaçant la sendEmailVerificationNotification() sur votre modèle User. Cela change simplement quelle notification est envoyée.

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

Merci à patricus pour le code, cela fonctionne comme un charme, mais je ne sais pas pourquoi il était nécessaire de mettre ceci:

class VerifyEmailQueued extends VerifyEmail implements ShouldQueue
{
    public $connection;
    public $queue;
    public $delay;
    //
}

Ces variables étaient nécessaires pour être public dans mon cas.

Merci!

0
Mauricio Molina