Je viens de passer à Laravel 5.7 et maintenant je me sers de la vérification intégrée du courrier électronique. Cependant, il y a deux choses que je n'ai pas pu comprendre et le problème principal est comment puis-je personnaliser le courrier électronique envoyé à l'utilisateur pour qu'il vérifie son courrier électronique? Je ne peux pas non plus comprendre comment initier l'envoi de cet email si les utilisateurs changent leur email mais je peux le sauvegarder pour un autre thread.
Lorsque vous souhaitez ajouter la vérification de courrier électronique dans Laravel 5.7, la méthode suggérée consiste à implémenter Illuminate\Contracts\Auth\MustVerifyEmail
et à utiliser le trait Illuminate\Auth\MustVerifyEmail
sur le modèle App\User
.
Pour créer un comportement personnalisé, vous pouvez remplacer la méthode sendEmailVerificationNotification
, qui est la méthode qui informe l'utilisateur créé en appelant la méthode notify
, et transmet en tant que paramètre une nouvelle instance de la classe Notifications\MustVerifyEmail
.
Vous pouvez créer une notification personnalisée qui sera transmise en tant que paramètre à la fonction $this->notify()
dans la méthode sendEmailVerificationNotification dans votre modèle utilisateur:
public function sendEmailVerificationNotification()
{
$this->notify(new App\Notifications\CustomVerifyEmail);
}
... alors dans votre notification CustomVerifyEmail
, vous pouvez définir le mode de traitement de la vérification. Vous pouvez notifier l'utilisateur créé en envoyant un courrier électronique avec un fichier verification.route personnalisé, qui prendra les paramètres de votre choix.
Processus de notification de vérification de courrier électronique
Lorsqu'un nouvel utilisateur s'inscrit, un événement Illuminate\Auth\Events\Registered
est émis dans le App\Http\Controllers\Auth\RegisterController
et cet événement Registered
a un écouteur appelé Illuminate\Auth\Listeners\SendEmailVerificationNotification
qui est enregistré dans le App\Providers\EventServiceProvider
:
protected $listen = [
Registered::class => [
SendEmailVerificationNotification::class,
]
];
L'écouteur SendEmailVerificationNotification
vérifie si l'utilisateur $ - qui est passé en tant que paramètre à new Registered($user = $this->create($request->all()))
dans l'authentification par défaut de Laravel App\Http\Controllers\Auth\RegisterController
- est une instance de Illuminate\Contracts\Auth\MustVerifyEmail
qui est le nom de la caractéristique que Laravel suggère d'utiliser dans le modèle App\User
lorsque vous souhaitez fournir vérification de l'email par défaut et vérifiez également que $user
n'est pas déjà vérifié. Si tout se passe bien, la méthode sendEmailVerificationNotification
est appelée sur cet utilisateur:
if ($event->user instanceof MustVerifyEmail && !$event->user->hasVerifiedEmail()) {
$event->user->sendEmailVerificationNotification();
}
Je pense que le moyen le plus simple de faire cela est de faire une nouvelle notification en utilisant les documents ici: https://laravel.com/docs/5.7/notifications#creating-notifications
Puis remplacez la fonction:
public function sendEmailVerificationNotification()
{
$this->notify(new App\Notifications\CustomEmailNotification);
}
Dans le modèle des utilisateurs.
Ou tu peux
php artisan vendor:publish --tag=laravel-notifications
Cela copiera les modèles dans le répertoire resources/views/vendor/notifications et vous pourrez les modifier à cet emplacement.
Pour un moyen rapide et facile:
php artisan vendor:publish --tag=laravel-notifications
Il crée un nouveau fichier dans:
\resources\views\vendor\notifications
Ceci est le modèle de courrier électronique de Laravel. Vous pouvez le changer et le personnaliser.
Accédez à ces fichiers
vendor/laravel/framework/src/Illuminate/Auth/MustVerifyEmail.php
vendor/laravel/framework/src/Illuminate/Auth/Notifications/VerifyEmail.php
et ensuite le personnaliser ... vous pouvez même introduire un constructeur dans vendor/laravel/framework/src/Illuminate/Auth/Notifications/VerifyEmail.php et transmettre la valeur via vendor/laravel/framework/src/Illuminate/Auth/MustVerifyEmail.php
En s'appuyant légèrement sur la réponse d'Andrew Earls, vous pouvez également publier tous les composants de courrier de démarquage utilisés par l'application avec cette commande:
php artisan vendor:publish --tag=laravel-mail
Une fois que cela est fait, vous aurez une série de fichiers html et markdown à modifier dans resources/views/vendor/mail
. Cela vous permettra de modifier la disposition générale de l'e-mail et également de "thème" le CSS. Je vous recommande vivement de lire attentivement les documents Mail - Personnalisation des composants .
En tant que guide de démarrage rapide de la messagerie électronique (Laravel 5.7), vous pouvez:
php artisan vendor:publish --tag=laravel-mail
.resources/views/vendor/mail/html/themes/default.css
dans votre propre fichier. par exemple resources/views/vendor/mail/html/themes/wayne.css
config/mail.php
et où vous voyez 'theme' => 'default'
changez-le en 'theme' => 'wayne'
wayne.css
pour redéfinir le style de vos courriels.J'espère que ça aide quelqu'un.
Malheureusement, cet e-mail envoyé ne provient pas d'une "vue", il s'agit d'une Notification
construite en ligne. C’est à cet endroit qu’il est actuellement construit lorsqu’il doit être envoyé: Illuminate\Auth\Notifications\VerifyEmail@toMail
. Cette classe particulière a un rappel statique qui peut être défini pour construire cet email au lieu de le laisser le faire.
Dans un fournisseur de services de la méthode boot
, vous devrez affecter un rappel à cette classe:
Quelque chose "comme" cela pourrait fonctionner:
public function boot()
{
\Illuminate\Auth\Notifications\VerifyEmail::toMailUsing(function ($notifiable) {
// this is what is currently being done
// adjust for your needs
return (new \Illuminate\Notifications\Messages\MailMessage)
->subject(\Lang::getFromJson('Verify Email Address'))
->line(\Lang::getFromJson('Please click the button below to verify your email address.'))
->action(
\Lang::getFromJson('Verify Email Address'),
$this->verificationUrl($notifiable)
)
->line(\Lang::getFromJson('If you did not create an account, no further action is required.'));
});
}
Comme il s'agit d'une notification, vous devriez avoir plus d'options pour la personnaliser.
Si vous souhaitez utiliser votre propre classe Notification
, vous pouvez remplacer la méthode sendEmailVerificationNotification
sur le modèle User
(Authenticatable
) (elle provient du trait MustVerifyEmail
).
Deuxième question:
La VerificationController
(App\Http\Controllers\Auth\VerificationController
) que vous devriez avoir a une méthode nommée resend
(du trait VerifiesEmails
) qui ressemble à un bon candidat à cet effet.
Vous devez configurer les itinéraires pour ces itinéraires de vérification via Auth::routes(['verify' => true]);
Remarque:
Le système de vérification utilise un champ de la table users
email_verified_at
dans 5.7 pour marquer ceci. Vous voulez vous assurer que vous avez ce champ. Lorsque l'utilisateur change d'adresse e-mail, je suppose que vous pouvez créer cette variable null
puis les rediriger vers la route resend
afin d'envoyer la nouvelle vérification. Cela les mettra dans un état "non vérifié" jusqu'à ce qu'ils revérifient, si c'est ce que vous avez l'intention de faire.
Mettre à jour:
On dirait que nous allions dans la bonne voie. J'ai trouvé cette SO réponse qui aborde des choses similaires:
Changer le champ “sujet” par défaut pour l'email de vérification dans laravel 5.7