File tree Expand file tree Collapse file tree 2 files changed +30
-0
lines changed Expand file tree Collapse file tree 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_class ($ 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 @@ -79,6 +79,27 @@ public function testRenderWithContextReservedEmailEntry()
79
79
$ this ->prepareEmail ('Text ' , '' , ['email ' => 'reserved! ' ]);
80
80
}
81
81
82
+ public function testRenderedOnce ()
83
+ {
84
+ $ twig = new Environment (new ArrayLoader ([
85
+ 'text ' => 'Text ' ,
86
+ ]));
87
+ $ renderer = new BodyRenderer ($ twig );
88
+ $ email = (new TemplatedEmail ())
89
+ ->to ('fabien@symfony.com ' )
90
+ ->from ('helene@symfony.com ' )
91
+ ;
92
+ $ email ->textTemplate ('text ' );
93
+
94
+ $ renderer ->render ($ email );
95
+ $ this ->assertEquals ('Text ' , $ email ->getTextBody ());
96
+
97
+ $ email ->text ('reset ' );
98
+
99
+ $ renderer ->render ($ email );
100
+ $ this ->assertEquals ('reset ' , $ email ->getTextBody ());
101
+ }
102
+
82
103
private function prepareEmail (?string $ text , ?string $ html , array $ context = []): TemplatedEmail
83
104
{
84
105
$ twig = new Environment (new ArrayLoader ([
You can’t perform that action at this time.
0 commit comments