Skip to content

Commit b0f4188

Browse files
committed
Render email once
1 parent c97d850 commit b0f4188

File tree

2 files changed

+30
-0
lines changed

2 files changed

+30
-0
lines changed

src/Symfony/Bridge/Twig/Mime/BodyRenderer.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,14 @@ public function render(Message $message): void
4646
}
4747

4848
$messageContext = $message->getContext();
49+
50+
$previousRenderingKey = $messageContext[__CLASS__] ?? null;
51+
unset($messageContext[__CLASS__]);
52+
$currentRenderingKey = md5(serialize([$messageContext, $message->getTextTemplate(), $message->getHtmlTemplate()]));
53+
if ($previousRenderingKey === $currentRenderingKey) {
54+
return;
55+
}
56+
4957
if (isset($messageContext['email'])) {
5058
throw new InvalidArgumentException(sprintf('A "%s" context cannot have an "email" entry as this is a reserved variable.', get_debug_type($message)));
5159
}
@@ -66,6 +74,7 @@ public function render(Message $message): void
6674
if (!$message->getTextBody() && null !== $html = $message->getHtmlBody()) {
6775
$message->text($this->convertHtmlToText(\is_resource($html) ? stream_get_contents($html) : $html));
6876
}
77+
$message->context($message->getContext() + [__CLASS__ => $currentRenderingKey]);
6978
}
7079

7180
private function convertHtmlToText(string $html): string

src/Symfony/Bridge/Twig/Tests/Mime/BodyRendererTest.php

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,27 @@ public function testRenderWithContextReservedEmailEntry()
6262
$this->prepareEmail('Text', '', ['email' => 'reserved!']);
6363
}
6464

65+
public function testRenderedOnce()
66+
{
67+
$twig = new Environment(new ArrayLoader([
68+
'text' => 'Text',
69+
]));
70+
$renderer = new BodyRenderer($twig);
71+
$email = (new TemplatedEmail())
72+
->to('fabien@symfony.com')
73+
->from('helene@symfony.com')
74+
;
75+
$email->textTemplate('text');
76+
77+
$renderer->render($email);
78+
$this->assertEquals('Text', $email->getTextBody());
79+
80+
$email->text('reset');
81+
82+
$renderer->render($email);
83+
$this->assertEquals('reset', $email->getTextBody());
84+
}
85+
6586
private function prepareEmail(?string $text, ?string $html, array $context = []): TemplatedEmail
6687
{
6788
$twig = new Environment(new ArrayLoader([

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy