TP : Agence immo, demande de contact

Voir la vidéo
Description Sommaire

Dans ce chapitre nous allons mettre en place le formulaire de contact qui va permettre aux utilisateurs de contacter l'agence lorsqu'ils sont intéressés par les biens. Ce chapitre sera l'occasion de découvrir le système de Mailablequi permet d'envoyer des utilisateurs depuis Laravel.

Configuration

Si vous essayez d'envoyer des emails avec Laravel, par défaut, en mode développement, il est configuré pour écrire les emails envoyés dans le fichier de log. Cette méthode est pratique parce qu'elle vous permet de tester vos emails sans forcément avoir besoin d'un serveur SMTP mais il n'est pas forcément évident de lire ce fichier pour visualiser les emails.

Aussi je vous conseille d'utiliser des outils comme mailhog qui vont vous permettre de créer un serveur SMTP sur votre machine qui sera capable de capturer les emails qui vont être envoyés. Ces outils vous offrent ensuite une interface web, qui ressemble à un client email, dans lequel vous allez pouvoir consulter les emails qui ont été capturés.

Il vous faudra ensuite modifier le fichier d'environnement pour mettre les informations correspondant à cet outil.

MAIL_MAILER=smtp
MAIL_HOST=localhost
MAIL_PORT=1025

Vous pouvez aussi regarder le fichier de configuration config/mail.php pour voir les différents protocoles qui sont supportés et la configuration de base.

Mailable

Pour commencer à gérer l'envoi d'email on doit créer une classe qui va représenter le mail à envoyer

php artisan make:mail PropertyContactMail

Cette commande va créer une classe qui étend de Illuminate\Mail\Mailable qu'il faudra modifier en fonction de nos besoin. Dans notre cas nous allons modifier le constructeur pour lui passer les informations qui nous intéresse (les données du formulaire ainsi que le bien associé à la demande).

<?php

namespace App\Mail;

use App\Models\Property;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Mail\Mailables\Content;
use Illuminate\Mail\Mailables\Envelope;
use Illuminate\Queue\SerializesModels;

class PropertyContactMail extends Mailable
{
    use Queueable, SerializesModels;

    public function __construct(
        public Property $property, 
        public array $data
    )
    {
    }

    public function envelope(): Envelope
    {
        return new Envelope(
            to: 'admin@doe.fr',
            replyTo: $this->data['email'],
            subject: 'Property Contact Mail'
        );
    }

    public function content(): Content
    {
        return new Content(
            markdown: 'emails.property.contact',
        );
    }

    /**
     * @return array<int, \Illuminate\Mail\Mailables\Attachment>
     */
    public function attachments(): array
    {
        return [];
    }
}

La méthode envelope() permet de définir des attributs sur notre email tandis que la méthode content() permet de définir à quoi va ressembler le contenu de l'email. Pour cette partie contenu on peut définir l'email de différentes manières (text, html ou markdown) en utilisant le chemin vers une vue blade.

L'option markdown est intéréssante car elle permet de construire l'email plus rapidement en n'ayant pas à gérer la structure HTML complexe nécessaire pour un bon fonctionnement sur les différents clients mails.

<x-mail::message>
# Nouvelle demande de contact

Une nouvelle demande de contact a été fait pour le bien <a href="{{ route('property.show', ['slug' => $property->getSlug(), 'property' => $property]) }}">{{ $property->title }}</a>.

- Prénom : {{ $data['firstname'] }}
- Nom : {{ $data['lastname'] }}
- Téléphone : {{ $data['phone'] }}
- Email : {{ $data['email'] }}

**Message :**<br/>
{{ $data['message'] }}
</x-mail::message>

Envoi

Maintenant que l'on a notre classe qui permet de représenter un email il va falloir l instancier et l'envoyer.

use App\Http\Requests\PropertyContactRequest;
use App\Http\Requests\SearchPropertiesRequest;
use App\Mail\PropertyContactMail;
use App\Models\Property;
use Illuminate\Support\Facades\Mail;

public function contact(
    Property $property,
    PropertyContactRequest $request
)
{
    Mail::send(new PropertyContactMail($property, $request->validated()));
    return back()->with('success', 'Votre demande de contact a bien été envoyé');
}

Laravel dispose d'une façade Illuminate\Support\Facades\Mailqui attend en paramètre une instance de Mailable.

Publié
Technologies utilisées
Auteur :
Grafikart
Partager