Nous souhaitons envoyer un courriel à un utilisateur quand il a créé un nouvel article sur le blogue.
Avec Artisan, on crée la Class PostCreated
et le template de vue qui sera dans /resources/views/emails/post-created.blade.php
php artisan make:mail PostCreated -m 'emails.post-created'
La Class PostCreated
est dans le dossier /app/Mail/PostCreated.php
La vue post-created.blade.php
permet d'écrire le contenu du courriel en Markdown ⇒ https://fr.wikipedia.org/wiki/Markdown
Exemple dans le contrôleur PostController.php
, nous envoyons un courriel à la fin de la méthode store()
, une fois que l'article est enregistré
use Illuminate\Support\Facades\Mail; use App\Mail\PostCreated; use Illuminate\Support\Facades\Auth; ... public function store(Request $request) { ... $post->categories()->sync(request()->get('categories')); Mail::to(Auth::user()->email)->send( new PostCreated($post) ); return redirect('/posts')->with('status', "L'article a bien été créé");; }
En général, on essai de garder les contrôleurs les plus simples possibles. Envoyer des courriels à partir du contrôleur fonctionne mais si on doit effectuer cette action dans plusieurs endroit dans le code, il est préférable d'utiliser le modèle afin de centraliser l'envoi de courriels.
Pour cela, on utitise les événements d'Eloquent ⇒ https://laravel.com/docs/8.x/eloquent#events
Plusieurs types d'événements peuvent être déclenchés par Eloquent: retrieved
, creating
, created
, updating
, updated
, saving
, saved
, deleting
, deleted
, restoring
, restored
Nous allons utiliser l'événement created
dans le modèle Post.php
... use Illuminate\Support\Facades\Mail; use App\Mail\PostCreated; class Post extends Model { ... protected static function boot() { parent::boot(); static::created(function($post) { Mail::to(Auth::user()->email)->send( new PostCreated($post) ); }); }
Maintenant, quelque soit la partie de l'application qui crée l'article, le courriel sera envoyé.
Dans le modèle Post.php
, quand on instancie la class PostCreated($post)
, on envoi $post
.
Il faut maintenant modifier la Class /app/Mail/PostCreated.php
afin qu'elle envoie les informations ($post) à la vue qui gère le courriel.
class PostCreated extends Mailable { use Queueable, SerializesModels; public $post; /** * Create a new message instance. * * @return void */ public function __construct($post) { $this->post = $post; }
Voici un exemple de vue pour afficher le titre de l'article et un bouton qui permet d'aller voir l'article.
@component('mail::message') # Titre: {{ $post->title}} Vous avez écrit un nouvel article @component('mail::button', ['url' => url('/post/' . $post->id)]) voir l'article @endcomponent Merci !<br> {{ config('app.name') }} @endcomponent