Skip to content

Commit 3917970

Browse files
committed
Render email once
1 parent c97d850 commit 3917970

File tree

2 files changed

+30
-0
lines changed

2 files changed

+30
-0
lines changed

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

+9
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

+21
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)