File tree 2 files changed +30
-0
lines changed
2 files changed +30
-0
lines changed Original file line number Diff line number Diff line change @@ -46,6 +46,14 @@ public function render(Message $message): void
46
46
}
47
47
48
48
$ 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
+
49
57
if (isset ($ messageContext ['email ' ])) {
50
58
throw new InvalidArgumentException (sprintf ('A "%s" context cannot have an "email" entry as this is a reserved variable. ' , get_debug_type ($ message )));
51
59
}
@@ -66,6 +74,7 @@ public function render(Message $message): void
66
74
if (!$ message ->getTextBody () && null !== $ html = $ message ->getHtmlBody ()) {
67
75
$ message ->text ($ this ->convertHtmlToText (\is_resource ($ html ) ? stream_get_contents ($ html ) : $ html ));
68
76
}
77
+ $ message ->context ($ message ->getContext () + [__CLASS__ => $ currentRenderingKey ]);
69
78
}
70
79
71
80
private function convertHtmlToText (string $ html ): string
Original file line number Diff line number Diff line change @@ -62,6 +62,27 @@ public function testRenderWithContextReservedEmailEntry()
62
62
$ this ->prepareEmail ('Text ' , '' , ['email ' => 'reserved! ' ]);
63
63
}
64
64
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
+
65
86
private function prepareEmail (?string $ text , ?string $ html , array $ context = []): TemplatedEmail
66
87
{
67
88
$ twig = new Environment (new ArrayLoader ([
You can’t perform that action at this time.
0 commit comments