- Classe (message) :
AppoloDev\SFToolboxBundle\Message\EmailMessage - Classe (handler) :
AppoloDev\SFToolboxBundle\MessageHandler\EmailSenderHandler - Fichiers source :
src/Message/EmailMessage.php,src/MessageHandler/EmailSenderHandler.php
Couple message/handler Symfony Messenger pour l'envoi (potentiellement asynchrone, selon le transport configuré) d'emails templatés Twig. Il suffit de dispatch() un EmailMessage sur le bus — l'envoi effectif est pris en charge par EmailSenderHandler, enregistré automatiquement (#[AsMessageHandler]).
Deux variables d'environnement, utilisées par EmailSenderHandler :
SENDER_EMAIL=contact@monsite.fr
SENDER_NAME="Mon Site"
__construct(array $recipients, string $object, string $template, array $parameters = [], string $locale = 'en', array $files = [], ?string $logoPath = null)
$recipients: liste d'adresses email (string[]) — converties en interne enSymfony\Component\Mime\Address.$object: clé de traduction du sujet de l'email (traduite dans le domaineemailspar le handler — ce n'est pas un sujet littéral).$template: chemin du template Twig HTML de l'email (ex:emails/welcome.html.twig).$parameters: variables passées au contexte Twig du template.$locale: locale de traduction du sujet et de rendu, fusionnée dans le contexte Twig sous la clélocale(défaut'en').$files: pièces jointes, tableau d'éléments['file' => <objet avec getContent()>, 'filename' => string].$logoPath: chemin absolu vers un logo à intégrer en image inline (cid:logo) dans l'email ; sinullou fichier introuvable, le handler utilise%kernel.project_dir%/public/assets/images/logo.pngpar défaut (ce chemin doit exister dans le projet consommateur, sauf silogoPathest toujours fourni explicitement).
getRecipients(): array, getObject(): string, getTemplate(): string, getParameters(): array, getLocale(): string, getFiles(): array, getLogoPath(): ?string — simples getters, pas de logique.
Appelé automatiquement par Symfony Messenger lors du traitement du message (jamais directement). Construit un Symfony\Bridge\Twig\Mime\TemplatedEmail :
- expéditeur :
SENDER_EMAIL/SENDER_NAME(env vars), - sujet : traduction de
$emailMessage->getObject()dans le domaineemails, - logo intégré en pièce jointe inline (
cid:logo), - corps HTML :
$emailMessage->getTemplate(), avec le contexte$emailMessage->getParameters()fusionné avec['locale' => $emailMessage->getLocale()], - pièces jointes issues de
$emailMessage->getFiles(),
puis envoie via MailerInterface::send(). Peut lever une Symfony\Component\Mailer\Exception\TransportExceptionInterface en cas d'échec d'envoi.
use AppoloDev\SFToolboxBundle\Message\EmailMessage;
use Symfony\Component\Messenger\MessageBusInterface;
public function register(MessageBusInterface $bus, User $user): void
{
$bus->dispatch(new EmailMessage(
recipients: [$user->getEmail()],
object: 'welcome.subject', // clé de traduction, domaine "emails"
template: 'emails/welcome.html.twig',
parameters: ['firstname' => $user->getFirstname()],
locale: $user->getLocale(),
));
}Traductions à ajouter côté projet (domaine emails), ex. translations/emails.fr.yaml :
welcome.subject: "Bienvenue sur Mon Site !"Template emails/welcome.html.twig (extrait) :
<p>Bonjour {{ firstname }},</p>
<p>Bienvenue !</p>- Templates d'email — le champ
objectest traduit dans le domaineemails, distinct demessages/validators.