From 085185de4db792e1f033bf4a0013101a59dd61af Mon Sep 17 00:00:00 2001 From: Fabien Potencier Date: Tue, 6 Dec 2022 08:09:14 +0100 Subject: [PATCH] [Mailer] Fix rendered templates for notifications --- src/Symfony/Bridge/Twig/Mime/BodyRenderer.php | 4 +--- .../Bridge/Twig/Mime/NotificationEmail.php | 19 +++++++++++++++++-- .../Bridge/Twig/Mime/TemplatedEmail.php | 12 ++++++++++++ .../Mailer/Transport/AbstractTransport.php | 2 +- src/Symfony/Component/Mailer/composer.json | 3 ++- 5 files changed, 33 insertions(+), 7 deletions(-) diff --git a/src/Symfony/Bridge/Twig/Mime/BodyRenderer.php b/src/Symfony/Bridge/Twig/Mime/BodyRenderer.php index 397b35f1569d2..d418ee2f38634 100644 --- a/src/Symfony/Bridge/Twig/Mime/BodyRenderer.php +++ b/src/Symfony/Bridge/Twig/Mime/BodyRenderer.php @@ -59,15 +59,13 @@ public function render(Message $message): void if ($template = $message->getTextTemplate()) { $message->text($this->twig->render($template, $vars)); - $message->textTemplate(null); } if ($template = $message->getHtmlTemplate()) { $message->html($this->twig->render($template, $vars)); - $message->htmlTemplate(null); } - $message->context([]); + $message->markAsRendered(); // if text body is empty, compute one from the HTML body if (!$message->getTextBody() && null !== $html = $message->getHtmlBody()) { diff --git a/src/Symfony/Bridge/Twig/Mime/NotificationEmail.php b/src/Symfony/Bridge/Twig/Mime/NotificationEmail.php index 7f70d322041de..be6fea5c9cc56 100644 --- a/src/Symfony/Bridge/Twig/Mime/NotificationEmail.php +++ b/src/Symfony/Bridge/Twig/Mime/NotificationEmail.php @@ -40,6 +40,7 @@ class NotificationEmail extends TemplatedEmail 'raw' => false, 'footer_text' => 'Notification e-mail sent by Symfony', ]; + private bool $rendered = false; public function __construct(Headers $headers = null, AbstractPart $body = null) { @@ -178,6 +179,18 @@ public function getContext(): array return array_merge($this->context, parent::getContext()); } + public function isRendered(): bool + { + return $this->rendered; + } + + public function markAsRendered(): void + { + parent::markAsRendered(); + + $this->rendered = true; + } + public function getPreparedHeaders(): Headers { $headers = parent::getPreparedHeaders(); @@ -225,7 +238,7 @@ private function getExceptionAsString(\Throwable|FlattenException $exception): s */ public function __serialize(): array { - return [$this->context, $this->theme, parent::__serialize()]; + return [$this->context, $this->theme, $this->rendered, parent::__serialize()]; } /** @@ -233,7 +246,9 @@ public function __serialize(): array */ public function __unserialize(array $data): void { - if (3 === \count($data)) { + if (4 === \count($data)) { + [$this->context, $this->theme, $this->rendered, $parentData] = $data; + } elseif (3 === \count($data)) { [$this->context, $this->theme, $parentData] = $data; } else { // Backwards compatibility for deserializing data structures that were serialized without the theme diff --git a/src/Symfony/Bridge/Twig/Mime/TemplatedEmail.php b/src/Symfony/Bridge/Twig/Mime/TemplatedEmail.php index 083b007726310..777cc06b58984 100644 --- a/src/Symfony/Bridge/Twig/Mime/TemplatedEmail.php +++ b/src/Symfony/Bridge/Twig/Mime/TemplatedEmail.php @@ -67,6 +67,18 @@ public function getContext(): array return $this->context; } + public function isRendered(): bool + { + return null === $this->htmlTemplate && null === $this->textTemplate; + } + + public function markAsRendered(): void + { + $this->textTemplate = null; + $this->htmlTemplate = null; + $this->context = []; + } + /** * @internal */ diff --git a/src/Symfony/Component/Mailer/Transport/AbstractTransport.php b/src/Symfony/Component/Mailer/Transport/AbstractTransport.php index e7fd082c79b07..a6710d007da02 100644 --- a/src/Symfony/Component/Mailer/Transport/AbstractTransport.php +++ b/src/Symfony/Component/Mailer/Transport/AbstractTransport.php @@ -76,7 +76,7 @@ public function send(RawMessage $message, Envelope $envelope = null): ?SentMessa $envelope = $event->getEnvelope(); $message = $event->getMessage(); - if ($message instanceof TemplatedEmail && ($message->getTextTemplate() || $message->getHtmlTemplate())) { + if ($message instanceof TemplatedEmail && !$message->isRendered()) { throw new LogicException(sprintf('You must configure a "%s" when a "%s" instance has a text or HTML template set.', BodyRendererInterface::class, get_debug_type($message))); } diff --git a/src/Symfony/Component/Mailer/composer.json b/src/Symfony/Component/Mailer/composer.json index a79d3af133a2f..e83a4aade2ee9 100644 --- a/src/Symfony/Component/Mailer/composer.json +++ b/src/Symfony/Component/Mailer/composer.json @@ -33,7 +33,8 @@ "conflict": { "symfony/http-kernel": "<5.4", "symfony/messenger": "<6.2", - "symfony/mime": "<6.2" + "symfony/mime": "<6.2", + "symfony/twig-bridge": "<6.2.1" }, "autoload": { "psr-4": { "Symfony\\Component\\Mailer\\": "" },