From 731f9b02ef7649af4d690f78b8c440190aaf2188 Mon Sep 17 00:00:00 2001 From: Pierre Tanguy Date: Wed, 10 May 2023 17:41:35 +0100 Subject: [PATCH] [Notifier] Add Brevo bridge (formerly Sendinblue) --- .../FrameworkExtension.php | 1 + .../Resources/config/notifier_transports.php | 8 +- .../Notifier/Bridge/Brevo/.gitattributes | 4 + .../Notifier/Bridge/Brevo/.gitignore | 3 + .../Notifier/Bridge/Brevo/BrevoTransport.php | 88 +++++++++++++++++++ .../Bridge/Brevo/BrevoTransportFactory.php | 43 +++++++++ .../Notifier/Bridge/Brevo/CHANGELOG.md | 7 ++ .../Component/Notifier/Bridge/Brevo/LICENSE | 19 ++++ .../Component/Notifier/Bridge/Brevo/README.md | 26 ++++++ .../Brevo/Tests/BrevoTransportFactoryTest.php | 53 +++++++++++ .../Bridge/Brevo/Tests/BrevoTransportTest.php | 66 ++++++++++++++ .../Notifier/Bridge/Brevo/composer.json | 34 +++++++ .../Notifier/Bridge/Brevo/phpunit.xml.dist | 31 +++++++ .../Notifier/Bridge/Sendinblue/CHANGELOG.md | 5 ++ .../Bridge/Sendinblue/SendinblueTransport.php | 2 + .../Sendinblue/SendinblueTransportFactory.php | 5 ++ .../Tests/SendinblueTransportFactoryTest.php | 3 + .../Tests/SendinblueTransportTest.php | 3 + .../Exception/UnsupportedSchemeException.php | 4 + .../UnsupportedSchemeExceptionTest.php | 2 + src/Symfony/Component/Notifier/Transport.php | 1 + 21 files changed, 406 insertions(+), 2 deletions(-) create mode 100644 src/Symfony/Component/Notifier/Bridge/Brevo/.gitattributes create mode 100644 src/Symfony/Component/Notifier/Bridge/Brevo/.gitignore create mode 100644 src/Symfony/Component/Notifier/Bridge/Brevo/BrevoTransport.php create mode 100644 src/Symfony/Component/Notifier/Bridge/Brevo/BrevoTransportFactory.php create mode 100644 src/Symfony/Component/Notifier/Bridge/Brevo/CHANGELOG.md create mode 100644 src/Symfony/Component/Notifier/Bridge/Brevo/LICENSE create mode 100644 src/Symfony/Component/Notifier/Bridge/Brevo/README.md create mode 100644 src/Symfony/Component/Notifier/Bridge/Brevo/Tests/BrevoTransportFactoryTest.php create mode 100644 src/Symfony/Component/Notifier/Bridge/Brevo/Tests/BrevoTransportTest.php create mode 100644 src/Symfony/Component/Notifier/Bridge/Brevo/composer.json create mode 100644 src/Symfony/Component/Notifier/Bridge/Brevo/phpunit.xml.dist diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php index 981a865672296..fd4b7f61959da 100644 --- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php +++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php @@ -2721,6 +2721,7 @@ private function registerNotifierConfiguration(array $config, ContainerBuilder $ NotifierBridge\AllMySms\AllMySmsTransportFactory::class => 'notifier.transport_factory.all-my-sms', NotifierBridge\AmazonSns\AmazonSnsTransportFactory::class => 'notifier.transport_factory.amazon-sns', NotifierBridge\Bandwidth\BandwidthTransportFactory::class => 'notifier.transport_factory.bandwidth', + NotifierBridge\Brevo\BrevoTransportFactory::class => 'notifier.transport_factory.brevo', NotifierBridge\Chatwork\ChatworkTransportFactory::class => 'notifier.transport_factory.chatwork', NotifierBridge\Clickatell\ClickatellTransportFactory::class => 'notifier.transport_factory.clickatell', NotifierBridge\ClickSend\ClickSendTransportFactory::class => 'notifier.transport_factory.click-send', diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/notifier_transports.php b/src/Symfony/Bundle/FrameworkBundle/Resources/config/notifier_transports.php index 1573aa0bea0a4..886e6bd4cf6f0 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/config/notifier_transports.php +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/notifier_transports.php @@ -22,6 +22,10 @@ ->abstract() ->args([service('event_dispatcher'), service('http_client')->ignoreOnInvalid()]) + ->set('notifier.transport_factory.brevo', Bridge\Brevo\BrevoTransportFactory::class) + ->parent('notifier.transport_factory.abstract') + ->tag('texter.transport_factory') + ->set('notifier.transport_factory.slack', Bridge\Slack\SlackTransportFactory::class) ->parent('notifier.transport_factory.abstract') ->tag('chatter.transport_factory') @@ -279,11 +283,11 @@ ->set('notifier.transport_factory.simple-textin', Bridge\SimpleTextin\SimpleTextinTransportFactory::class) ->parent('notifier.transport_factory.abstract') ->tag('texter.transport_factory') - + ->set('notifier.transport_factory.click-send', Bridge\ClickSend\ClickSendTransportFactory::class) ->parent('notifier.transport_factory.abstract') ->tag('texter.transport_factory') - + ->set('notifier.transport_factory.smsmode', Bridge\Smsmode\SmsmodeTransportFactory::class) ->parent('notifier.transport_factory.abstract') ->tag('texter.transport_factory') diff --git a/src/Symfony/Component/Notifier/Bridge/Brevo/.gitattributes b/src/Symfony/Component/Notifier/Bridge/Brevo/.gitattributes new file mode 100644 index 0000000000000..84c7add058fb5 --- /dev/null +++ b/src/Symfony/Component/Notifier/Bridge/Brevo/.gitattributes @@ -0,0 +1,4 @@ +/Tests export-ignore +/phpunit.xml.dist export-ignore +/.gitattributes export-ignore +/.gitignore export-ignore diff --git a/src/Symfony/Component/Notifier/Bridge/Brevo/.gitignore b/src/Symfony/Component/Notifier/Bridge/Brevo/.gitignore new file mode 100644 index 0000000000000..c49a5d8df5c65 --- /dev/null +++ b/src/Symfony/Component/Notifier/Bridge/Brevo/.gitignore @@ -0,0 +1,3 @@ +vendor/ +composer.lock +phpunit.xml diff --git a/src/Symfony/Component/Notifier/Bridge/Brevo/BrevoTransport.php b/src/Symfony/Component/Notifier/Bridge/Brevo/BrevoTransport.php new file mode 100644 index 0000000000000..3c420044e2afb --- /dev/null +++ b/src/Symfony/Component/Notifier/Bridge/Brevo/BrevoTransport.php @@ -0,0 +1,88 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Notifier\Bridge\Brevo; + +use Symfony\Component\Notifier\Exception\TransportException; +use Symfony\Component\Notifier\Exception\UnsupportedMessageTypeException; +use Symfony\Component\Notifier\Message\MessageInterface; +use Symfony\Component\Notifier\Message\SentMessage; +use Symfony\Component\Notifier\Message\SmsMessage; +use Symfony\Component\Notifier\Transport\AbstractTransport; +use Symfony\Contracts\EventDispatcher\EventDispatcherInterface; +use Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface; +use Symfony\Contracts\HttpClient\HttpClientInterface; + +/** + * @author Pierre Tanguy + */ +final class BrevoTransport extends AbstractTransport +{ + protected const HOST = 'api.brevo.com'; + + public function __construct( + #[\SensitiveParameter] private readonly string $apiKey, + private readonly string $sender, + HttpClientInterface $client = null, + EventDispatcherInterface $dispatcher = null + ) { + parent::__construct($client, $dispatcher); + } + + public function __toString(): string + { + return sprintf('brevo://%s?sender=%s', $this->getEndpoint(), $this->sender); + } + + public function supports(MessageInterface $message): bool + { + return $message instanceof SmsMessage; + } + + protected function doSend(MessageInterface $message): SentMessage + { + if (!$message instanceof SmsMessage) { + throw new UnsupportedMessageTypeException(__CLASS__, SmsMessage::class, $message); + } + + $sender = $message->getFrom() ?: $this->sender; + + $response = $this->client->request('POST', 'https://'.$this->getEndpoint().'/v3/transactionalSMS/sms', [ + 'json' => [ + 'sender' => $sender, + 'recipient' => $message->getPhone(), + 'content' => $message->getSubject(), + ], + 'headers' => [ + 'api-key' => $this->apiKey, + ], + ]); + + try { + $statusCode = $response->getStatusCode(); + } catch (TransportExceptionInterface $e) { + throw new TransportException('Could not reach the remote Brevo server.', $response, 0, $e); + } + + if (201 !== $statusCode) { + $error = $response->toArray(false); + + throw new TransportException('Unable to send the SMS: '.$error['message'], $response); + } + + $success = $response->toArray(false); + + $sentMessage = new SentMessage($message, (string) $this); + $sentMessage->setMessageId($success['messageId']); + + return $sentMessage; + } +} diff --git a/src/Symfony/Component/Notifier/Bridge/Brevo/BrevoTransportFactory.php b/src/Symfony/Component/Notifier/Bridge/Brevo/BrevoTransportFactory.php new file mode 100644 index 0000000000000..d4fbe25ce7afe --- /dev/null +++ b/src/Symfony/Component/Notifier/Bridge/Brevo/BrevoTransportFactory.php @@ -0,0 +1,43 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Notifier\Bridge\Brevo; + +use Symfony\Component\Notifier\Exception\UnsupportedSchemeException; +use Symfony\Component\Notifier\Transport\AbstractTransportFactory; +use Symfony\Component\Notifier\Transport\Dsn; + +/** + * @author Pierre Tanguy + */ +final class BrevoTransportFactory extends AbstractTransportFactory +{ + public function create(Dsn $dsn): BrevoTransport + { + $scheme = $dsn->getScheme(); + + if ('brevo' !== $scheme) { + throw new UnsupportedSchemeException($dsn, 'brevo', $this->getSupportedSchemes()); + } + + $apiKey = $this->getUser($dsn); + $sender = $dsn->getRequiredOption('sender'); + $host = 'default' === $dsn->getHost() ? null : $dsn->getHost(); + $port = $dsn->getPort(); + + return (new BrevoTransport($apiKey, $sender, $this->client, $this->dispatcher))->setHost($host)->setPort($port); + } + + protected function getSupportedSchemes(): array + { + return ['brevo']; + } +} diff --git a/src/Symfony/Component/Notifier/Bridge/Brevo/CHANGELOG.md b/src/Symfony/Component/Notifier/Bridge/Brevo/CHANGELOG.md new file mode 100644 index 0000000000000..7e873f81cb0fe --- /dev/null +++ b/src/Symfony/Component/Notifier/Bridge/Brevo/CHANGELOG.md @@ -0,0 +1,7 @@ +CHANGELOG +========= + +6.4 +--- + +* Add the bridge diff --git a/src/Symfony/Component/Notifier/Bridge/Brevo/LICENSE b/src/Symfony/Component/Notifier/Bridge/Brevo/LICENSE new file mode 100644 index 0000000000000..3ed9f412ce53d --- /dev/null +++ b/src/Symfony/Component/Notifier/Bridge/Brevo/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2023-present Fabien Potencier + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/src/Symfony/Component/Notifier/Bridge/Brevo/README.md b/src/Symfony/Component/Notifier/Bridge/Brevo/README.md new file mode 100644 index 0000000000000..1e02dc773b679 --- /dev/null +++ b/src/Symfony/Component/Notifier/Bridge/Brevo/README.md @@ -0,0 +1,26 @@ +Brevo Notifier +=============== + +Provides [Brevo](https://brevo.com) integration for Symfony Notifier. +This bridge was created following the rebranding of Sendinblue. + +DSN example +----------- + +``` +BREVO_DSN=brevo://API_KEY@default?sender=SENDER +``` + +where: +- `API_KEY` is your api key from your Brevo account +- `SENDER` is your sender's phone number + +See more info at https://developers.brevo.com/reference/sendtransacsms + +Resources +--------- + +* [Contributing](https://symfony.com/doc/current/contributing/index.html) +* [Report issues](https://github.com/symfony/symfony/issues) and + [send Pull Requests](https://github.com/symfony/symfony/pulls) + in the [main Symfony repository](https://github.com/symfony/symfony) diff --git a/src/Symfony/Component/Notifier/Bridge/Brevo/Tests/BrevoTransportFactoryTest.php b/src/Symfony/Component/Notifier/Bridge/Brevo/Tests/BrevoTransportFactoryTest.php new file mode 100644 index 0000000000000..07a9185afbd36 --- /dev/null +++ b/src/Symfony/Component/Notifier/Bridge/Brevo/Tests/BrevoTransportFactoryTest.php @@ -0,0 +1,53 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Notifier\Bridge\Brevo\Tests; + +use Symfony\Component\Notifier\Bridge\Brevo\BrevoTransportFactory; +use Symfony\Component\Notifier\Test\TransportFactoryTestCase; + +final class BrevoTransportFactoryTest extends TransportFactoryTestCase +{ + public function createFactory(): BrevoTransportFactory + { + return new BrevoTransportFactory(); + } + + public static function createProvider(): iterable + { + yield [ + 'brevo://host.test?sender=0611223344', + 'brevo://apiKey@host.test?sender=0611223344', + ]; + } + + public static function supportsProvider(): iterable + { + yield [true, 'brevo://apiKey@default?sender=0611223344']; + yield [false, 'somethingElse://apiKey@default?sender=0611223344']; + } + + public static function incompleteDsnProvider(): iterable + { + yield 'missing api_key' => ['brevo://default?sender=0611223344']; + } + + public static function missingRequiredOptionProvider(): iterable + { + yield 'missing option: sender' => ['brevo://apiKey@host.test']; + } + + public static function unsupportedSchemeProvider(): iterable + { + yield ['somethingElse://apiKey@default?sender=0611223344']; + yield ['somethingElse://apiKey@host']; // missing "sender" option + } +} diff --git a/src/Symfony/Component/Notifier/Bridge/Brevo/Tests/BrevoTransportTest.php b/src/Symfony/Component/Notifier/Bridge/Brevo/Tests/BrevoTransportTest.php new file mode 100644 index 0000000000000..cfdad9f6207e4 --- /dev/null +++ b/src/Symfony/Component/Notifier/Bridge/Brevo/Tests/BrevoTransportTest.php @@ -0,0 +1,66 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Notifier\Bridge\Brevo\Tests; + +use Symfony\Component\HttpClient\MockHttpClient; +use Symfony\Component\Notifier\Bridge\Brevo\BrevoTransport; +use Symfony\Component\Notifier\Exception\TransportException; +use Symfony\Component\Notifier\Message\ChatMessage; +use Symfony\Component\Notifier\Message\SmsMessage; +use Symfony\Component\Notifier\Test\TransportTestCase; +use Symfony\Component\Notifier\Tests\Transport\DummyMessage; +use Symfony\Contracts\HttpClient\HttpClientInterface; +use Symfony\Contracts\HttpClient\ResponseInterface; + +final class BrevoTransportTest extends TransportTestCase +{ + public static function createTransport(HttpClientInterface $client = null): BrevoTransport + { + return (new BrevoTransport('api-key', '0611223344', $client ?? new MockHttpClient()))->setHost('host.test'); + } + + public static function toStringProvider(): iterable + { + yield ['brevo://host.test?sender=0611223344', self::createTransport()]; + } + + public static function supportedMessagesProvider(): iterable + { + yield [new SmsMessage('0611223344', 'Hello!')]; + } + + public static function unsupportedMessagesProvider(): iterable + { + yield [new ChatMessage('Hello!')]; + yield [new DummyMessage()]; + } + + public function testSendWithErrorResponseThrowsTransportException() + { + $response = $this->createMock(ResponseInterface::class); + $response->expects($this->exactly(2)) + ->method('getStatusCode') + ->willReturn(400); + $response->expects($this->once()) + ->method('getContent') + ->willReturn(json_encode(['code' => 400, 'message' => 'bad request'])); + + $client = new MockHttpClient(static fn (): ResponseInterface => $response); + + $transport = self::createTransport($client); + + $this->expectException(TransportException::class); + $this->expectExceptionMessage('Unable to send the SMS: bad request'); + + $transport->send(new SmsMessage('phone', 'testMessage')); + } +} diff --git a/src/Symfony/Component/Notifier/Bridge/Brevo/composer.json b/src/Symfony/Component/Notifier/Bridge/Brevo/composer.json new file mode 100644 index 0000000000000..7ee5193cc1f80 --- /dev/null +++ b/src/Symfony/Component/Notifier/Bridge/Brevo/composer.json @@ -0,0 +1,34 @@ +{ + "name": "symfony/brevo-notifier", + "type": "symfony-notifier-bridge", + "description": "Symfony Brevo Notifier Bridge", + "keywords": ["brevo", "notifier"], + "homepage": "https://symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Pierre Tanguy", + "homepage": "https://github.com/petanguy" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "require": { + "php": ">=8.1", + "symfony/http-client": "^5.4|^6.0", + "symfony/notifier": "^6.4" + }, + "require-dev": { + "symfony/event-dispatcher": "^5.4|^6.0" + }, + "autoload": { + "psr-4": {"Symfony\\Component\\Notifier\\Bridge\\Brevo\\": ""}, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "minimum-stability": "dev" +} + diff --git a/src/Symfony/Component/Notifier/Bridge/Brevo/phpunit.xml.dist b/src/Symfony/Component/Notifier/Bridge/Brevo/phpunit.xml.dist new file mode 100644 index 0000000000000..a185c4f2adf76 --- /dev/null +++ b/src/Symfony/Component/Notifier/Bridge/Brevo/phpunit.xml.dist @@ -0,0 +1,31 @@ + + + + + + + + + + ./Tests/ + + + + + + ./ + + + ./Resources + ./Tests + ./vendor + + + diff --git a/src/Symfony/Component/Notifier/Bridge/Sendinblue/CHANGELOG.md b/src/Symfony/Component/Notifier/Bridge/Sendinblue/CHANGELOG.md index b21e89b9d23c9..4190565fa0bab 100644 --- a/src/Symfony/Component/Notifier/Bridge/Sendinblue/CHANGELOG.md +++ b/src/Symfony/Component/Notifier/Bridge/Sendinblue/CHANGELOG.md @@ -1,6 +1,11 @@ CHANGELOG ========= +6.3 +--- + +* Deprecated the bridge, replaced it with Brevo in reaction to their rebranding. + 6.2 --- diff --git a/src/Symfony/Component/Notifier/Bridge/Sendinblue/SendinblueTransport.php b/src/Symfony/Component/Notifier/Bridge/Sendinblue/SendinblueTransport.php index 2a83177eff98b..ce44b626b76a2 100644 --- a/src/Symfony/Component/Notifier/Bridge/Sendinblue/SendinblueTransport.php +++ b/src/Symfony/Component/Notifier/Bridge/Sendinblue/SendinblueTransport.php @@ -23,6 +23,8 @@ /** * @author Pierre Tondereau + * + * @deprecated since Symfony 6.3, use BrevoTransport instead */ final class SendinblueTransport extends AbstractTransport { diff --git a/src/Symfony/Component/Notifier/Bridge/Sendinblue/SendinblueTransportFactory.php b/src/Symfony/Component/Notifier/Bridge/Sendinblue/SendinblueTransportFactory.php index 3d9eddf337bc9..f3e9f0fbee4af 100644 --- a/src/Symfony/Component/Notifier/Bridge/Sendinblue/SendinblueTransportFactory.php +++ b/src/Symfony/Component/Notifier/Bridge/Sendinblue/SendinblueTransportFactory.php @@ -11,17 +11,22 @@ namespace Symfony\Component\Notifier\Bridge\Sendinblue; +use Symfony\Component\Notifier\Bridge\Brevo\BrevoTransport; use Symfony\Component\Notifier\Exception\UnsupportedSchemeException; use Symfony\Component\Notifier\Transport\AbstractTransportFactory; use Symfony\Component\Notifier\Transport\Dsn; /** * @author Pierre Tondereau + * + * @deprecated since Symfony 6.3, use BrevoTransportFactory instead */ final class SendinblueTransportFactory extends AbstractTransportFactory { public function create(Dsn $dsn): SendinblueTransport { + trigger_deprecation('symfony/sendinblue-notifier', '6.3', 'The "%s" class is deprecated, use "%s" instead.', SendinblueTransport::class, BrevoTransport::class); + $scheme = $dsn->getScheme(); if ('sendinblue' !== $scheme) { diff --git a/src/Symfony/Component/Notifier/Bridge/Sendinblue/Tests/SendinblueTransportFactoryTest.php b/src/Symfony/Component/Notifier/Bridge/Sendinblue/Tests/SendinblueTransportFactoryTest.php index 322f07e041495..88e2025c71421 100644 --- a/src/Symfony/Component/Notifier/Bridge/Sendinblue/Tests/SendinblueTransportFactoryTest.php +++ b/src/Symfony/Component/Notifier/Bridge/Sendinblue/Tests/SendinblueTransportFactoryTest.php @@ -14,6 +14,9 @@ use Symfony\Component\Notifier\Bridge\Sendinblue\SendinblueTransportFactory; use Symfony\Component\Notifier\Test\TransportFactoryTestCase; +/** + * @group legacy + */ final class SendinblueTransportFactoryTest extends TransportFactoryTestCase { public function createFactory(): SendinblueTransportFactory diff --git a/src/Symfony/Component/Notifier/Bridge/Sendinblue/Tests/SendinblueTransportTest.php b/src/Symfony/Component/Notifier/Bridge/Sendinblue/Tests/SendinblueTransportTest.php index f2d2f2bfad73f..5b817adfdcc89 100644 --- a/src/Symfony/Component/Notifier/Bridge/Sendinblue/Tests/SendinblueTransportTest.php +++ b/src/Symfony/Component/Notifier/Bridge/Sendinblue/Tests/SendinblueTransportTest.php @@ -21,6 +21,9 @@ use Symfony\Contracts\HttpClient\HttpClientInterface; use Symfony\Contracts\HttpClient\ResponseInterface; +/** + * @group legacy + */ final class SendinblueTransportTest extends TransportTestCase { public static function createTransport(HttpClientInterface $client = null): SendinblueTransport diff --git a/src/Symfony/Component/Notifier/Exception/UnsupportedSchemeException.php b/src/Symfony/Component/Notifier/Exception/UnsupportedSchemeException.php index b11264ce610cf..519af7fee8e96 100644 --- a/src/Symfony/Component/Notifier/Exception/UnsupportedSchemeException.php +++ b/src/Symfony/Component/Notifier/Exception/UnsupportedSchemeException.php @@ -28,6 +28,10 @@ class UnsupportedSchemeException extends LogicException 'class' => Bridge\Bandwidth\BandwidthTransportFactory::class, 'package' => 'symfony/bandwidth-notifier', ], + 'brevo' => [ + 'class' => Bridge\Brevo\BrevoTransportFactory::class, + 'package' => 'symfony/brevo-notifier', + ], 'chatwork' => [ 'class' => Bridge\Chatwork\ChatworkTransportFactory::class, 'package' => 'symfony/chatwork-notifier', diff --git a/src/Symfony/Component/Notifier/Tests/Exception/UnsupportedSchemeExceptionTest.php b/src/Symfony/Component/Notifier/Tests/Exception/UnsupportedSchemeExceptionTest.php index d211d15422e8f..50146ca8e4a83 100644 --- a/src/Symfony/Component/Notifier/Tests/Exception/UnsupportedSchemeExceptionTest.php +++ b/src/Symfony/Component/Notifier/Tests/Exception/UnsupportedSchemeExceptionTest.php @@ -29,6 +29,7 @@ public static function setUpBeforeClass(): void Bridge\AllMySms\AllMySmsTransportFactory::class => false, Bridge\AmazonSns\AmazonSnsTransportFactory::class => false, Bridge\Bandwidth\BandwidthTransportFactory::class => false, + Bridge\Brevo\BrevoTransportFactory::class => false, Bridge\Chatwork\ChatworkTransportFactory::class => false, Bridge\Clickatell\ClickatellTransportFactory::class => false, Bridge\ClickSend\ClickSendTransportFactory::class => false, @@ -112,6 +113,7 @@ public static function messageWhereSchemeIsPartOfSchemeToPackageMapProvider(): \ yield ['allmysms', 'symfony/all-my-sms-notifier']; yield ['sns', 'symfony/amazon-sns-notifier']; yield ['bandwidth', 'symfony/bandwidth-notifier']; + yield ['brevo', 'symfony/brevo-notifier']; yield ['clickatell', 'symfony/clickatell-notifier']; yield ['clicksend', 'symfony/click-send-notifier']; yield ['contact-everyone', 'symfony/contact-everyone-notifier']; diff --git a/src/Symfony/Component/Notifier/Transport.php b/src/Symfony/Component/Notifier/Transport.php index db21d16134598..a1341e6a71571 100644 --- a/src/Symfony/Component/Notifier/Transport.php +++ b/src/Symfony/Component/Notifier/Transport.php @@ -31,6 +31,7 @@ final class Transport Bridge\AllMySms\AllMySmsTransportFactory::class, Bridge\AmazonSns\AmazonSnsTransportFactory::class, Bridge\Bandwidth\BandwidthTransportFactory::class, + Bridge\Brevo\BrevoTransportFactory::class, Bridge\Chatwork\ChatworkTransportFactory::class, Bridge\Clickatell\ClickatellTransportFactory::class, Bridge\ClickSend\ClickSendTransportFactory::class,