wake-up-neo.com

Warteschlange Laravel 5.7 E-Mail-Bestätigung

Die in Laravel 5.7 enthaltene Funktion "E-Mail-Verifizierung" funktioniert gut, aber das asynchrone Versenden von E-Mails (während der Benutzerregistrierung oder Link-Seite erneut senden) ist nicht ideal.

Gibt es eine Möglichkeit, die E-Mail-Bestätigungs-E-Mail durch eine Warteschlange zu senden, ohne die gesamte E-Mail-Bestätigungsprüfung in Laravel 5.7 umzuschreiben?

3
François

Ja! Es ist möglich. Und dazu müssen Sie die sendEmailVerificationNotification in Ihren App\User schreiben. Diese Methode wird von der Illuminate\Auth\MustVerfiyEmail-Eigenschaft bereitgestellt. Die Methode sendEmailVerificationNotification benachrichtigt die erstellte user durch Senden einer E-Mail wie in der Illuminate\Auth\Notifications\VerifyEmail-Benachrichtigungsklasse definiert.

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

Sie können diese Methode ändern, um den Benutzer nicht direkt zu benachrichtigen. Sie müssen eine Job definieren, die Sie in der sendEmailVerificationNotification-Methode anzeigen, anstatt den erstellten Benutzer zu benachrichtigen.

In der Job-Klasse, die Sie in der handle-Methode erstellen, können Sie die E-Mail an die user senden. Sie müssen jedoch den $user für den Job angeben, der ausgeführt werden kann, indem Sie ihn der dispatch-Methode als Parameter übergeben

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

$this in der Methode stellt die erstellte user dar, und der App\Jobs\VerififyEmail-Job, den Sie erstellen, erhält alle Parameter, die an die dispatch übergeben werden. __construct

Der Code der VerifyEmail wird so aussehen

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

Es gibt keinen eingebauten Weg, aber Sie können dies einfach durch Erweitern und Überschreiben tun.

Erstellen Sie zunächst eine neue Benachrichtigung, die die integrierte Benachrichtigung erweitert und außerdem den ShouldQueue-Vertrag implementiert (um die Warteschlange zu aktivieren). Die folgende Klasse nimmt an, dass Sie eine Benachrichtigung unter app/Notifications/VerifyEmailQueued.php erstellen:

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.
}

Jetzt müssen Sie dem Framework mitteilen, dass es Ihre benutzerdefinierte Benachrichtigung anstelle der Standardbenachrichtigung verwenden soll. Sie tun dies, indem Sie die sendEmailVerificationNotification() in Ihrem User-Modell überschreiben. Dadurch wird lediglich geändert, welche Benachrichtigung gesendet wird.

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

Dank an patricus für den Code funktioniert es wie ein Zauber, aber ich weiß nicht, warum dies notwendig war:

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

Diese Variablen waren notwendig, um in meinem Fall öffentlich zu sein.

Vielen Dank!

0
Mauricio Molina