Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit aefcbb8

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

File tree

8 files changed

+59
-3
lines changed

8 files changed

+59
-3
lines changed

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

+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 <[email protected]>
@@ -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

+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

+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

+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

+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 <[email protected]>
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

+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('[email protected]'), [new Address('[email protected]')]), 'smtp');
127+
$listener->onMessage($event);
128+
129+
$this->assertSame('hello.world', $message->getSubject());
130+
}
117131
}

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)