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?
Oui! C'est possible. Et pour ce faire, vous devrez réécrire le sendEmailVerificationNotification
dans votre App\User
. Cette méthode est fournie par le trait Illuminate\Auth\MustVerfiyEmail
. La méthode sendEmailVerificationNotification
informe le user
créé 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 Job
que vous dissiperez dans la méthode sendEmailVerificationNotification
au lieu d'avertir l'utilisateur créé.
Dans la classe Job
que vous allez créer dans la méthode handle
name__, vous pouvez envoyer l'e-mail à user
mais vous devez fournir le $user
au Job, en le transmettant en tant que paramètre à la méthode dispatch
name__.
public function sendEmailVerificationNotification()
{
VerifyEmail::dispatch($this);
}
$this
dans la méthode représente le user
créé et le travail App\Jobs\VerififyEmail
que vous allez créer recevra tous les paramètres passés au dispatch
dans celui-ci __construct
Le code de VerifyEmail
ressemblera à 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);
}
}
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);
}
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!