Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit9f3c30a

Browse files
committed
bug#40446 [TwigBridge] Fix "Serialization of 'Closure'" error when rendering an TemplatedEmail (jderusse)
This PR was merged into the 4.4 branch.Discussion----------[TwigBridge] Fix "Serialization of 'Closure'" error when rendering an TemplatedEmail| Q | A| ------------- | ---| Branch? | 4.4| Bug fix? | yes| New feature? | no| Deprecations? | no| Tickets |Fix#40445| License | MIT| Doc PR |When context contains a closure, it can't be serialized. In that case, we now assume that fingerprint is always different, and in that case, email will always be re-renderedCommits-------c3e30eb Fix fingerprint when context is not serializable
2 parents756522e +c3e30eb commit9f3c30a

File tree

2 files changed

+39
-1
lines changed

2 files changed

+39
-1
lines changed

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

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ public function render(Message $message): void
4949

5050
$previousRenderingKey =$messageContext[__CLASS__] ??null;
5151
unset($messageContext[__CLASS__]);
52-
$currentRenderingKey =md5(serialize([$messageContext,$message->getTextTemplate(),$message->getHtmlTemplate()]));
52+
$currentRenderingKey =$this->getFingerPrint($message);
5353
if ($previousRenderingKey ===$currentRenderingKey) {
5454
return;
5555
}
@@ -77,6 +77,23 @@ public function render(Message $message): void
7777
$message->context($message->getContext() + [__CLASS__ =>$currentRenderingKey]);
7878
}
7979

80+
privatefunctiongetFingerPrint(TemplatedEmail$message):string
81+
{
82+
$messageContext =$message->getContext();
83+
unset($messageContext[__CLASS__]);
84+
85+
$payload = [$messageContext,$message->getTextTemplate(),$message->getHtmlTemplate()];
86+
try {
87+
$serialized =serialize($payload);
88+
}catch (\Exception$e) {
89+
// Serialization of 'Closure' is not allowed
90+
// Happens when context contain a closure, in that case, we assume that context always change.
91+
$serialized =random_bytes(8);
92+
}
93+
94+
returnmd5($serialized);
95+
}
96+
8097
privatefunctionconvertHtmlToText(string$html):string
8198
{
8299
if (null !==$this->converter) {

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

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,27 @@ public function testRenderedOnce()
100100
$this->assertEquals('reset',$email->getTextBody());
101101
}
102102

103+
publicfunctiontestRenderedOnceUnserializableContext()
104+
{
105+
$twig =newEnvironment(newArrayLoader([
106+
'text' =>'Text',
107+
]));
108+
$renderer =newBodyRenderer($twig);
109+
$email = (newTemplatedEmail())
110+
->to('fabien@symfony.com')
111+
->from('helene@symfony.com')
112+
;
113+
$email->textTemplate('text');
114+
$email->context([
115+
'foo' =>staticfunction () {
116+
return'bar';
117+
},
118+
]);
119+
120+
$renderer->render($email);
121+
$this->assertEquals('Text',$email->getTextBody());
122+
}
123+
103124
privatefunctionprepareEmail(?string$text, ?string$html,array$context = []):TemplatedEmail
104125
{
105126
$twig =newEnvironment(newArrayLoader([

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp