Skip to content

Navigation Menu

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

Appearance settings

Commit aefcbb8

Browse filesBrowse files
committed
[Mailer][TwigBridge] Add support for translatable subject
1 parent 86c8a8a commit aefcbb8
Copy full SHA for aefcbb8

File tree

8 files changed

+59
-3
lines changed
Filter options

8 files changed

+59
-3
lines changed

‎src/Symfony/Bridge/Twig/CHANGELOG.md

Copy file name to clipboardExpand all lines: src/Symfony/Bridge/Twig/CHANGELOG.md
+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ CHANGELOG
66

77
* Add `is_granted_for_user()` Twig function
88
* Add `field_id()` Twig form helper function
9+
* Add `TemplatedEmail::translatableSubject` method
910

1011
7.2
1112
---

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

Copy file name to clipboardExpand all lines: src/Symfony/Bridge/Twig/Mime/TemplatedEmail.php
+19-1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
namespace Symfony\Bridge\Twig\Mime;
1313

1414
use Symfony\Component\Mime\Email;
15+
use Symfony\Contracts\Translation\TranslatableInterface;
1516

1617
/**
1718
* @author Fabien Potencier <fabien@symfony.com>
@@ -22,6 +23,7 @@ class TemplatedEmail extends Email
2223
private ?string $textTemplate = null;
2324
private ?string $locale = null;
2425
private array $context = [];
26+
private ?TranslatableInterface $translatableSubject = null;
2527

2628
/**
2729
* @return $this
@@ -83,6 +85,21 @@ public function getContext(): array
8385
return $this->context;
8486
}
8587

88+
/**
89+
* @return $this
90+
*/
91+
public function translatableSubject(TranslatableInterface $subject): static
92+
{
93+
$this->translatableSubject = $subject;
94+
95+
return $this;
96+
}
97+
98+
public function getTranslatableSubject(): ?TranslatableInterface
99+
{
100+
return $this->translatableSubject;
101+
}
102+
86103
public function isRendered(): bool
87104
{
88105
return null === $this->htmlTemplate && null === $this->textTemplate;
@@ -100,7 +117,7 @@ public function markAsRendered(): void
100117
*/
101118
public function __serialize(): array
102119
{
103-
return [$this->htmlTemplate, $this->textTemplate, $this->context, parent::__serialize(), $this->locale];
120+
return [$this->htmlTemplate, $this->textTemplate, $this->context, parent::__serialize(), $this->locale, $this->translatableSubject];
104121
}
105122

106123
/**
@@ -110,6 +127,7 @@ public function __unserialize(array $data): void
110127
{
111128
[$this->htmlTemplate, $this->textTemplate, $this->context, $parentData] = $data;
112129
$this->locale = $data[4] ?? null;
130+
$this->translatableSubject = $data[5] ?? null;
113131

114132
parent::__unserialize($parentData);
115133
}

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

Copy file name to clipboardExpand all lines: src/Symfony/Bridge/Twig/Tests/Mime/TemplatedEmailTest.php
+4
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
2222
use Symfony\Component\Serializer\Normalizer\PropertyNormalizer;
2323
use Symfony\Component\Serializer\Serializer;
24+
use Symfony\Component\Translation\TranslatableMessage;
2425

2526
class TemplatedEmailTest extends TestCase
2627
{
@@ -44,13 +45,15 @@ public function testSerialize()
4445
->htmlTemplate('text.html.twig')
4546
->context($context = ['a' => 'b'])
4647
->locale($locale = 'fr_FR')
48+
->translatableSubject($subject = new TranslatableMessage('hello {{ name }}', ['name' => 'John'], 'greetings'))
4749
;
4850

4951
$email = unserialize(serialize($email));
5052
$this->assertEquals('text.txt.twig', $email->getTextTemplate());
5153
$this->assertEquals('text.html.twig', $email->getHtmlTemplate());
5254
$this->assertEquals($context, $email->getContext());
5355
$this->assertEquals($locale, $email->getLocale());
56+
$this->assertEquals($subject, $email->getTranslatableSubject());
5457
}
5558

5659
public function testSymfonySerialize()
@@ -73,6 +76,7 @@ public function testSymfonySerialize()
7376
"context": {
7477
"foo": "bar"
7578
},
79+
"translatableSubject": null,
7680
"text": null,
7781
"textCharset": null,
7882
"html": null,

‎src/Symfony/Bundle/TwigBundle/Resources/config/mailer.php

Copy file name to clipboardExpand all lines: src/Symfony/Bundle/TwigBundle/Resources/config/mailer.php
+5-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,11 @@
1818
return static function (ContainerConfigurator $container) {
1919
$container->services()
2020
->set('twig.mailer.message_listener', MessageListener::class)
21-
->args([null, service('twig.mime_body_renderer')])
21+
->args([
22+
null,
23+
service('twig.mime_body_renderer'),
24+
'$translator' => service('translator')->ignoreOnInvalid(),
25+
])
2226
->tag('kernel.event_subscriber')
2327

2428
->set('twig.mime_body_renderer', BodyRenderer::class)

‎src/Symfony/Component/Mailer/CHANGELOG.md

Copy file name to clipboardExpand all lines: src/Symfony/Component/Mailer/CHANGELOG.md
+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ CHANGELOG
99
* Add DSN param `source_ip` to allow binding to a (specific) IPv4 or IPv6 address.
1010
* Add DSN param `require_tls` to enforce use of TLS/STARTTLS
1111
* Add `DkimSignedMessageListener`, `SmimeEncryptedMessageListener`, and `SmimeSignedMessageListener`
12+
* Add support for translatable subject
1213

1314
7.2
1415
---

‎src/Symfony/Component/Mailer/EventListener/MessageListener.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/Mailer/EventListener/MessageListener.php
+14-1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
namespace Symfony\Component\Mailer\EventListener;
1313

14+
use Symfony\Bridge\Twig\Mime\TemplatedEmail;
1415
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
1516
use Symfony\Component\Mailer\Event\MessageEvent;
1617
use Symfony\Component\Mailer\Exception\InvalidArgumentException;
@@ -19,9 +20,10 @@
1920
use Symfony\Component\Mime\Header\Headers;
2021
use Symfony\Component\Mime\Header\MailboxListHeader;
2122
use Symfony\Component\Mime\Message;
23+
use Symfony\Contracts\Translation\TranslatorInterface;
2224

2325
/**
24-
* Manipulates the headers and the body of a Message.
26+
* Manipulates the headers, subject and the body of a Message.
2527
*
2628
* @author Fabien Potencier <fabien@symfony.com>
2729
*/
@@ -45,6 +47,7 @@ public function __construct(
4547
private ?Headers $headers = null,
4648
private ?BodyRendererInterface $renderer = null,
4749
array $headerRules = self::DEFAULT_RULES,
50+
private ?TranslatorInterface $translator = null,
4851
) {
4952
foreach ($headerRules as $headerName => $rule) {
5053
$this->addHeaderRule($headerName, $rule);
@@ -68,6 +71,7 @@ public function onMessage(MessageEvent $event): void
6871
}
6972

7073
$this->setHeaders($message);
74+
$this->translateSubject($message);
7175
$this->renderMessage($message);
7276
}
7377

@@ -115,6 +119,15 @@ private function setHeaders(Message $message): void
115119
}
116120
}
117121

122+
private function translateSubject(Message $message): void
123+
{
124+
if (!$message instanceof TemplatedEmail || !$this->translator || !$message->getTranslatableSubject()) {
125+
return;
126+
}
127+
128+
$message->subject($message->getTranslatableSubject()->trans($this->translator, $message->getLocale()));
129+
}
130+
118131
private function renderMessage(Message $message): void
119132
{
120133
if (!$this->renderer) {

‎src/Symfony/Component/Mailer/Tests/EventListener/MessageListenerTest.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/Mailer/Tests/EventListener/MessageListenerTest.php
+14
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
namespace Symfony\Component\Mailer\Tests\EventListener;
1313

1414
use PHPUnit\Framework\TestCase;
15+
use Symfony\Bridge\Twig\Mime\TemplatedEmail;
1516
use Symfony\Component\Mailer\Envelope;
1617
use Symfony\Component\Mailer\Event\MessageEvent;
1718
use Symfony\Component\Mailer\EventListener\MessageListener;
@@ -20,6 +21,8 @@
2021
use Symfony\Component\Mime\Header\MailboxListHeader;
2122
use Symfony\Component\Mime\Header\UnstructuredHeader;
2223
use Symfony\Component\Mime\Message;
24+
use Symfony\Component\Translation\IdentityTranslator;
25+
use Symfony\Component\Translation\TranslatableMessage;
2326

2427
class MessageListenerTest extends TestCase
2528
{
@@ -114,4 +117,15 @@ public static function provideHeaders(): iterable
114117
];
115118
yield 'Capitalized header rule (case-insensitive), replace if set' => [$initialHeaders, $defaultHeaders, $defaultHeaders, $rules];
116119
}
120+
121+
public function testTranslatableSubject()
122+
{
123+
$message = new TemplatedEmail();
124+
$message->translatableSubject(new TranslatableMessage('hello.world'));
125+
$listener = new MessageListener(translator: new IdentityTranslator());
126+
$event = new MessageEvent($message, new Envelope(new Address('sender@example.com'), [new Address('recipient@example.com')]), 'smtp');
127+
$listener->onMessage($event);
128+
129+
$this->assertSame('hello.world', $message->getSubject());
130+
}
117131
}

‎src/Symfony/Component/Mailer/composer.json

Copy file name to clipboardExpand all lines: src/Symfony/Component/Mailer/composer.json
+1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
"symfony/console": "^6.4|^7.0",
2929
"symfony/http-client": "^6.4|^7.0",
3030
"symfony/messenger": "^6.4|^7.0",
31+
"symfony/translation": "^6.4|^7.0",
3132
"symfony/twig-bridge": "^6.4|^7.0"
3233
},
3334
"conflict": {

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.