[TwigBridge] Throw an exception when one uses email as a context variable in a TemplatedEmail

This commit is contained in:
Fabien Potencier 2019-08-25 09:11:54 +02:00
parent 610a4e978f
commit 0cc705bf7d
2 changed files with 21 additions and 4 deletions

View File

@ -13,6 +13,7 @@ namespace Symfony\Bridge\Twig\Mime;
use League\HTMLToMarkdown\HtmlConverter;
use Symfony\Component\Mime\BodyRendererInterface;
use Symfony\Component\Mime\Exception\InvalidArgumentException;
use Symfony\Component\Mime\Message;
use Twig\Environment;
@ -44,7 +45,12 @@ final class BodyRenderer implements BodyRendererInterface
return;
}
$vars = array_merge($this->context, $message->getContext(), [
$messageContext = $message->getContext();
if (isset($messageContext['email'])) {
throw new InvalidArgumentException(sprintf('A "%s" context cannot have an "email" entry as this is a reserved variable.', TemplatedEmail::class));
}
$vars = array_merge($this->context, $messageContext, [
'email' => new WrappedTemplatedEmail($this->twig, $message),
]);

View File

@ -14,11 +14,12 @@ namespace Symfony\Bridge\Twig\Tests\Mime;
use PHPUnit\Framework\TestCase;
use Symfony\Bridge\Twig\Mime\BodyRenderer;
use Symfony\Bridge\Twig\Mime\TemplatedEmail;
use Symfony\Component\Mime\Exception\InvalidArgumentException;
use Symfony\Component\Mime\Part\Multipart\AlternativePart;
use Twig\Environment;
use Twig\Loader\ArrayLoader;
class RendererTest extends TestCase
class BodyRendererTest extends TestCase
{
public function testRenderTextOnly(): void
{
@ -54,7 +55,13 @@ class RendererTest extends TestCase
$this->assertEquals('<b>HTML</b>', $body->getParts()[1]->bodyToString());
}
private function prepareEmail(?string $text, ?string $html): TemplatedEmail
public function testRenderWithContextReservedEmailEntry(): void
{
$this->expectException(InvalidArgumentException::class);
$this->prepareEmail('Text', '', ['email' => 'reserved!']);
}
private function prepareEmail(?string $text, ?string $html, array $context = []): TemplatedEmail
{
$twig = new Environment(new ArrayLoader([
'text' => $text,
@ -63,7 +70,11 @@ class RendererTest extends TestCase
'image.jpg' => 'Some image data',
]));
$renderer = new BodyRenderer($twig);
$email = (new TemplatedEmail())->to('fabien@symfony.com')->from('helene@symfony.com');
$email = (new TemplatedEmail())
->to('fabien@symfony.com')
->from('helene@symfony.com')
->context($context)
;
if (null !== $text) {
$email->textTemplate('text');
}