From e51607ba723154444253299956a60361173c5e52 Mon Sep 17 00:00:00 2001 From: Kevin Bond Date: Wed, 26 Mar 2025 12:16:14 -0400 Subject: [PATCH 1/3] Revert "fix compatibility with TwigBridge < 7.3" This reverts commit 6ce7ec52ba1991cd07f8b2e2585f8bf890178c38. --- .../Component/Mailer/EventListener/MessageListener.php | 2 +- .../Mailer/Tests/EventListener/MessageListenerTest.php | 4 ---- src/Symfony/Component/Mailer/composer.json | 2 +- 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/Symfony/Component/Mailer/EventListener/MessageListener.php b/src/Symfony/Component/Mailer/EventListener/MessageListener.php index ff675521051f8..787b9376d4dae 100644 --- a/src/Symfony/Component/Mailer/EventListener/MessageListener.php +++ b/src/Symfony/Component/Mailer/EventListener/MessageListener.php @@ -122,7 +122,7 @@ private function setHeaders(Message $message): void private function translateSubject(Message $message): void { - if (!$message instanceof TemplatedEmail || !$this->translator || !method_exists(TemplatedEmail::class, 'getTranslatableSubject') || !$message->getTranslatableSubject() instanceof TranslatableMessage) { + if (!$message instanceof TemplatedEmail || !$this->translator || !$message->getTranslatableSubject() instanceof TranslatableMessage) { return; } diff --git a/src/Symfony/Component/Mailer/Tests/EventListener/MessageListenerTest.php b/src/Symfony/Component/Mailer/Tests/EventListener/MessageListenerTest.php index f47aae571f3b4..6ca41756c108a 100644 --- a/src/Symfony/Component/Mailer/Tests/EventListener/MessageListenerTest.php +++ b/src/Symfony/Component/Mailer/Tests/EventListener/MessageListenerTest.php @@ -120,10 +120,6 @@ public static function provideHeaders(): iterable public function testTranslatableSubject() { - if (!method_exists(TemplatedEmail::class, 'getTranslatableSubject')) { - $this->markTestSkipped('symfony/twig-bridge 7.3 or higher required'); - } - $message = new TemplatedEmail(); $message->subject(new TranslatableMessage('hello.world')); $listener = new MessageListener(translator: new class implements TranslatorInterface { diff --git a/src/Symfony/Component/Mailer/composer.json b/src/Symfony/Component/Mailer/composer.json index 7bc6978e363b9..9b36cb678055e 100644 --- a/src/Symfony/Component/Mailer/composer.json +++ b/src/Symfony/Component/Mailer/composer.json @@ -21,7 +21,7 @@ "psr/event-dispatcher": "^1", "psr/log": "^1|^2|^3", "symfony/event-dispatcher": "^6.4|^7.0", - "symfony/mime": "^7.2", + "symfony/mime": "^7.3", "symfony/service-contracts": "^2.5|^3" }, "require-dev": { From f638a6afa0151f5c703f189f9b46c804ab87b23c Mon Sep 17 00:00:00 2001 From: Kevin Bond Date: Wed, 26 Mar 2025 12:16:31 -0400 Subject: [PATCH 2/3] Revert "[Mailer][TwigBridge] Add support for translatable subject" This reverts commit 97eb49be33232745a793084dcef8f0ef4674e8e6. --- src/Symfony/Bridge/Twig/CHANGELOG.md | 1 - .../Bridge/Twig/Mime/TemplatedEmail.php | 21 +--------------- .../Twig/Tests/Mime/TemplatedEmailTest.php | 17 ------------- .../TwigBundle/Resources/config/mailer.php | 6 +---- src/Symfony/Component/Mailer/CHANGELOG.md | 1 - .../Mailer/EventListener/MessageListener.php | 16 +------------ .../EventListener/MessageListenerTest.php | 24 ------------------- src/Symfony/Component/Mailer/composer.json | 3 +-- src/Symfony/Component/Mime/Email.php | 4 ++-- 9 files changed, 6 insertions(+), 87 deletions(-) diff --git a/src/Symfony/Bridge/Twig/CHANGELOG.md b/src/Symfony/Bridge/Twig/CHANGELOG.md index c34616f3892bb..9695fe09f0549 100644 --- a/src/Symfony/Bridge/Twig/CHANGELOG.md +++ b/src/Symfony/Bridge/Twig/CHANGELOG.md @@ -6,7 +6,6 @@ CHANGELOG * Add `is_granted_for_user()` Twig function * Add `field_id()` Twig form helper function - * Add `TemplatedEmail::getTranslatableSubject()` method 7.2 --- diff --git a/src/Symfony/Bridge/Twig/Mime/TemplatedEmail.php b/src/Symfony/Bridge/Twig/Mime/TemplatedEmail.php index b3b891e400bc0..2d308947f8498 100644 --- a/src/Symfony/Bridge/Twig/Mime/TemplatedEmail.php +++ b/src/Symfony/Bridge/Twig/Mime/TemplatedEmail.php @@ -18,29 +18,11 @@ */ class TemplatedEmail extends Email { - private string|\Stringable|null $subject = null; private ?string $htmlTemplate = null; private ?string $textTemplate = null; private ?string $locale = null; private array $context = []; - /** - * @return $this - */ - public function subject(string|\Stringable $subject): static - { - parent::subject($subject); - - $this->subject = $subject; - - return $this; - } - - public function getTranslatableSubject(): string|\Stringable|null - { - return $this->subject; - } - /** * @return $this */ @@ -118,7 +100,7 @@ public function markAsRendered(): void */ public function __serialize(): array { - return [$this->htmlTemplate, $this->textTemplate, $this->context, parent::__serialize(), $this->locale, $this->subject]; + return [$this->htmlTemplate, $this->textTemplate, $this->context, parent::__serialize(), $this->locale]; } /** @@ -128,7 +110,6 @@ public function __unserialize(array $data): void { [$this->htmlTemplate, $this->textTemplate, $this->context, $parentData] = $data; $this->locale = $data[4] ?? null; - $this->subject = $data[5] ?? null; parent::__unserialize($parentData); } diff --git a/src/Symfony/Bridge/Twig/Tests/Mime/TemplatedEmailTest.php b/src/Symfony/Bridge/Twig/Tests/Mime/TemplatedEmailTest.php index f36fed899d16f..f77b3ad4b5337 100644 --- a/src/Symfony/Bridge/Twig/Tests/Mime/TemplatedEmailTest.php +++ b/src/Symfony/Bridge/Twig/Tests/Mime/TemplatedEmailTest.php @@ -20,10 +20,7 @@ use Symfony\Component\Serializer\Normalizer\MimeMessageNormalizer; use Symfony\Component\Serializer\Normalizer\ObjectNormalizer; use Symfony\Component\Serializer\Normalizer\PropertyNormalizer; -use Symfony\Component\Serializer\Normalizer\TranslatableNormalizer; use Symfony\Component\Serializer\Serializer; -use Symfony\Component\Translation\IdentityTranslator; -use Symfony\Component\Translation\TranslatableMessage; class TemplatedEmailTest extends TestCase { @@ -47,7 +44,6 @@ public function testSerialize() ->htmlTemplate('text.html.twig') ->context($context = ['a' => 'b']) ->locale($locale = 'fr_FR') - ->subject($subject = new TranslatableMessage('hello {{ name }}', ['name' => 'John'], 'greetings')) ; $email = unserialize(serialize($email)); @@ -55,14 +51,12 @@ public function testSerialize() $this->assertEquals('text.html.twig', $email->getHtmlTemplate()); $this->assertEquals($context, $email->getContext()); $this->assertEquals($locale, $email->getLocale()); - $this->assertEquals($subject, $email->getTranslatableSubject()); } public function testSymfonySerialize() { // we don't add from/sender to check that validation is not triggered to serialize an email $e = new TemplatedEmail(); - $e->subject(new TranslatableMessage('hello.world')); $e->to('you@example.com'); $e->textTemplate('email.txt.twig'); $e->htmlTemplate('email.html.twig'); @@ -73,7 +67,6 @@ public function testSymfonySerialize() $expectedJson = <<services() ->set('twig.mailer.message_listener', MessageListener::class) - ->args([ - null, - service('twig.mime_body_renderer'), - '$translator' => service('translator')->ignoreOnInvalid(), - ]) + ->args([null, service('twig.mime_body_renderer')]) ->tag('kernel.event_subscriber') ->set('twig.mime_body_renderer', BodyRenderer::class) diff --git a/src/Symfony/Component/Mailer/CHANGELOG.md b/src/Symfony/Component/Mailer/CHANGELOG.md index ada28a2a8bc78..3816cc474948b 100644 --- a/src/Symfony/Component/Mailer/CHANGELOG.md +++ b/src/Symfony/Component/Mailer/CHANGELOG.md @@ -9,7 +9,6 @@ CHANGELOG * Add DSN param `source_ip` to allow binding to a (specific) IPv4 or IPv6 address. * Add DSN param `require_tls` to enforce use of TLS/STARTTLS * Add `DkimSignedMessageListener`, `SmimeEncryptedMessageListener`, and `SmimeSignedMessageListener` - * Add support for translatable subject in `TemplatedEmail` 7.2 --- diff --git a/src/Symfony/Component/Mailer/EventListener/MessageListener.php b/src/Symfony/Component/Mailer/EventListener/MessageListener.php index 787b9376d4dae..906e410faf83d 100644 --- a/src/Symfony/Component/Mailer/EventListener/MessageListener.php +++ b/src/Symfony/Component/Mailer/EventListener/MessageListener.php @@ -11,7 +11,6 @@ namespace Symfony\Component\Mailer\EventListener; -use Symfony\Bridge\Twig\Mime\TemplatedEmail; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\Mailer\Event\MessageEvent; use Symfony\Component\Mailer\Exception\InvalidArgumentException; @@ -20,11 +19,9 @@ use Symfony\Component\Mime\Header\Headers; use Symfony\Component\Mime\Header\MailboxListHeader; use Symfony\Component\Mime\Message; -use Symfony\Component\Translation\TranslatableMessage; -use Symfony\Contracts\Translation\TranslatorInterface; /** - * Manipulates the headers, subject, and the body of a Message. + * Manipulates the headers and the body of a Message. * * @author Fabien Potencier */ @@ -48,7 +45,6 @@ public function __construct( private ?Headers $headers = null, private ?BodyRendererInterface $renderer = null, array $headerRules = self::DEFAULT_RULES, - private ?TranslatorInterface $translator = null, ) { foreach ($headerRules as $headerName => $rule) { $this->addHeaderRule($headerName, $rule); @@ -72,7 +68,6 @@ public function onMessage(MessageEvent $event): void } $this->setHeaders($message); - $this->translateSubject($message); $this->renderMessage($message); } @@ -120,15 +115,6 @@ private function setHeaders(Message $message): void } } - private function translateSubject(Message $message): void - { - if (!$message instanceof TemplatedEmail || !$this->translator || !$message->getTranslatableSubject() instanceof TranslatableMessage) { - return; - } - - $message->subject($message->getTranslatableSubject()->trans($this->translator, $message->getLocale())); - } - private function renderMessage(Message $message): void { if (!$this->renderer) { diff --git a/src/Symfony/Component/Mailer/Tests/EventListener/MessageListenerTest.php b/src/Symfony/Component/Mailer/Tests/EventListener/MessageListenerTest.php index 6ca41756c108a..5f5def704bf33 100644 --- a/src/Symfony/Component/Mailer/Tests/EventListener/MessageListenerTest.php +++ b/src/Symfony/Component/Mailer/Tests/EventListener/MessageListenerTest.php @@ -12,7 +12,6 @@ namespace Symfony\Component\Mailer\Tests\EventListener; use PHPUnit\Framework\TestCase; -use Symfony\Bridge\Twig\Mime\TemplatedEmail; use Symfony\Component\Mailer\Envelope; use Symfony\Component\Mailer\Event\MessageEvent; use Symfony\Component\Mailer\EventListener\MessageListener; @@ -21,8 +20,6 @@ use Symfony\Component\Mime\Header\MailboxListHeader; use Symfony\Component\Mime\Header\UnstructuredHeader; use Symfony\Component\Mime\Message; -use Symfony\Component\Translation\TranslatableMessage; -use Symfony\Contracts\Translation\TranslatorInterface; class MessageListenerTest extends TestCase { @@ -117,25 +114,4 @@ public static function provideHeaders(): iterable ]; yield 'Capitalized header rule (case-insensitive), replace if set' => [$initialHeaders, $defaultHeaders, $defaultHeaders, $rules]; } - - public function testTranslatableSubject() - { - $message = new TemplatedEmail(); - $message->subject(new TranslatableMessage('hello.world')); - $listener = new MessageListener(translator: new class implements TranslatorInterface { - public function trans(string $id, array $parameters = [], ?string $domain = null, ?string $locale = null): string - { - return 'Hello World'; - } - - public function getLocale(): string - { - return 'en'; - } - }); - $event = new MessageEvent($message, new Envelope(new Address('sender@example.com'), [new Address('recipient@example.com')]), 'smtp'); - $listener->onMessage($event); - - $this->assertSame('Hello World', $message->getSubject()); - } } diff --git a/src/Symfony/Component/Mailer/composer.json b/src/Symfony/Component/Mailer/composer.json index 9b36cb678055e..4336e725133fc 100644 --- a/src/Symfony/Component/Mailer/composer.json +++ b/src/Symfony/Component/Mailer/composer.json @@ -21,14 +21,13 @@ "psr/event-dispatcher": "^1", "psr/log": "^1|^2|^3", "symfony/event-dispatcher": "^6.4|^7.0", - "symfony/mime": "^7.3", + "symfony/mime": "^7.2", "symfony/service-contracts": "^2.5|^3" }, "require-dev": { "symfony/console": "^6.4|^7.0", "symfony/http-client": "^6.4|^7.0", "symfony/messenger": "^6.4|^7.0", - "symfony/translation": "^6.4|^7.0", "symfony/twig-bridge": "^6.4|^7.0" }, "conflict": { diff --git a/src/Symfony/Component/Mime/Email.php b/src/Symfony/Component/Mime/Email.php index 4c988d1e009a9..e238ce39d1313 100644 --- a/src/Symfony/Component/Mime/Email.php +++ b/src/Symfony/Component/Mime/Email.php @@ -58,9 +58,9 @@ class Email extends Message /** * @return $this */ - public function subject(string|\Stringable $subject): static + public function subject(string $subject): static { - return $this->setHeaderBody('Text', 'Subject', (string) $subject); + return $this->setHeaderBody('Text', 'Subject', $subject); } public function getSubject(): ?string From 41cc1d6b1140aaed4a73104459a50c347e010641 Mon Sep 17 00:00:00 2001 From: Kevin Bond Date: Wed, 26 Mar 2025 12:57:46 -0400 Subject: [PATCH 3/3] code review --- src/Symfony/Bridge/Twig/Mime/TemplatedEmail.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Symfony/Bridge/Twig/Mime/TemplatedEmail.php b/src/Symfony/Bridge/Twig/Mime/TemplatedEmail.php index 2d308947f8498..68b3913eba367 100644 --- a/src/Symfony/Bridge/Twig/Mime/TemplatedEmail.php +++ b/src/Symfony/Bridge/Twig/Mime/TemplatedEmail.php @@ -100,7 +100,7 @@ public function markAsRendered(): void */ public function __serialize(): array { - return [$this->htmlTemplate, $this->textTemplate, $this->context, parent::__serialize(), $this->locale]; + return [$this->htmlTemplate, $this->textTemplate, $this->context, parent::__serialize(), $this->locale]; } /**