Statamic Peak

Article

Créez un formulaire de contact avec Symfony 6

Kévin Cluzel

0 min

Découvrez comment créer un formulaire permettant à un utilisateur de nous contacter avec Symfony 6.

Bonjour à tous ! Aujourd'hui, nous allons découvrir ensemble comment créer un formulaire de contact personnalisé, permettant à l'utilisateur de nous envoyer un mail depuis notre site utilisant Symfony 6.

Tout d'abord, nous allons configurer le mailer de Symfony. Pour cela, utilisons composer pour installer le mailer:

composer require symfony/mailer

Une fois ceci effectué, nous allons installer MailHog, un outil nous permettant de tester l'envoi de mails. Vous pourrez trouver les instructions d'installation et d'utilisation ici:

Une fois installé, on peut lancer le serveur MailHog et configurer dans le fichier .env de notre projet Symfony:

MAILER_DSN=smtp://127.0.0.1:1025

Nous allons maintenant pouvoir développer notre fonctionnalité de mailing. Tout d'abord, créons un Service, qui nous permettra d'appeler notre fonctionnalité d'envoi d'email dans tout notre code. Appelons le MailerService et plaçons le dans src/Services:

<?php

namespace App\Services;

use Symfony\Component\Mailer\MailerInterface;
Use Symfony\Component\Mime\Email;

class MailerService
{
    public function __construct (private MailerInterface $mailer) {

    }

    public function sendEmail(
        $to = 'siteadmin@hotmail.fr',
        $subject = 'This is the Mail subject !',
        $content = '',
        $text = ''
    ): void{
        $email = (new Email())
            ->from('noreply@mysite.com')
            ->to($to)
            ->subject($subject)
            ->text($text)
            ->html($content);
        $this->mailer->send($email);
    }
}

Ce Service pourra désormais être appelé dans nos contrôleurs dès que nous aurons besoin d'envoyer un email. Créons maintenant le formulaire ContactType dans notre dossier /src/Form et notre fichier twig dans templates/contact/index.twig.html:

<?php
namespace App\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class ContactType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name',TextType::class)
            ->add('email',EmailType::class)
            ->add('message', TextareaType::class, [
                'attr' => ['rows' => 6],
            ])
        ;
    }
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([]);
    }
}

{% extends 'base.html.twig' %}
{% block title %}Contactez nous{% endblock %}
{% block body %}
    noparse_083a78afffc022b1c6d5cd3c001c116e
        noparse_2db61d5cf30c79ef8e54467896d99f36
        <button class="btn">noparse_4d4b58cf1376a8bec84932918d125a18</button>
    noparse_250bb21d8a0d439fe09f34cde2663c9b
{% endblock %}

Nous avons maintenant la structure de notre formulaire de contact. Maintenant, nous allons nous charger de l'envoyer.

Créons notre ContactController:

<?php

namespace App\Controller;

use App\Form\ContactType;
use App\Services\MailerService;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Email;
use Symfony\Component\Routing\Annotation\Route;

class ContactController extends AbstractController
{
    /**
     * @Route("/contact", name="contact")
     */
    public function index(Request $request, MailerService $mailer)
    {
        $form = $this->createForm(ContactType::class);
        $form->handleRequest($request);
        if($form->isSubmitted() && $form->isValid()) {
            $contactFormData = $form->getData();
            $subject = 'Demande de contact sur votre site de ' . $contactFormData['email'];
            $content = $contactFormData['name'] . ' vous a envoyé le message suivant: ' . $contactFormData['message'];
            $mailer->sendEmail(subject: $subject, content: $content);
            $this->addFlash('success', 'Votre message a été envoyé');
            return $this->redirectToRoute('homepage');
        }
        return $this->render('contact/index.html.twig', [
            'form' => $form->createView()
        ]);
    }
}

Ce controlleur va donc afficher notre view avec le formulaire de contact et le traiter de la manière suivante:

On récupère les données du mailer, donne l'email du prospect dans le subject du mail, son nom et son message dans le corps. Libre à vous de customiser autrement pour adapter à vos besoins!

On peut alors lancer mailhog dans un terminal, tester dans notre navigateur l'envoi, avant de d'aller sur notre interface mailhog (de base localhost:8025 ). Le tour est joué!

Vous pouvez trouver le code de ce mailer sur ce dépôt Github.