From 5204f0f3f2d1cb06e10f01f61053aba2daf19946 Mon Sep 17 00:00:00 2001 From: Thibault Buathier Date: Mon, 20 Jun 2022 17:06:19 +0200 Subject: [PATCH] [Notifier] Add SMSFactor bridge --- .../FrameworkExtension.php | 2 + .../Resources/config/notifier_transports.php | 5 + .../Notifier/Bridge/SmsFactor/.gitattributes | 4 + .../Notifier/Bridge/SmsFactor/.gitignore | 3 + .../Notifier/Bridge/SmsFactor/CHANGELOG.md | 7 ++ .../Notifier/Bridge/SmsFactor/LICENSE | 19 +++ .../Notifier/Bridge/SmsFactor/README.md | 19 +++ .../Bridge/SmsFactor/SmsFactorPushType.php | 21 ++++ .../Bridge/SmsFactor/SmsFactorTransport.php | 116 ++++++++++++++++++ .../SmsFactor/SmsFactorTransportFactory.php | 57 +++++++++ .../Tests/SmsFactorTransportFactoryTest.php | 55 +++++++++ .../Tests/SmsFactorTransportTest.php | 44 +++++++ .../Notifier/Bridge/SmsFactor/composer.json | 31 +++++ .../Bridge/SmsFactor/phpunit.xml.dist | 31 +++++ .../Exception/UnsupportedSchemeException.php | 4 + .../UnsupportedSchemeExceptionTest.php | 3 + src/Symfony/Component/Notifier/Transport.php | 2 + 17 files changed, 423 insertions(+) create mode 100644 src/Symfony/Component/Notifier/Bridge/SmsFactor/.gitattributes create mode 100644 src/Symfony/Component/Notifier/Bridge/SmsFactor/.gitignore create mode 100644 src/Symfony/Component/Notifier/Bridge/SmsFactor/CHANGELOG.md create mode 100644 src/Symfony/Component/Notifier/Bridge/SmsFactor/LICENSE create mode 100644 src/Symfony/Component/Notifier/Bridge/SmsFactor/README.md create mode 100644 src/Symfony/Component/Notifier/Bridge/SmsFactor/SmsFactorPushType.php create mode 100644 src/Symfony/Component/Notifier/Bridge/SmsFactor/SmsFactorTransport.php create mode 100644 src/Symfony/Component/Notifier/Bridge/SmsFactor/SmsFactorTransportFactory.php create mode 100644 src/Symfony/Component/Notifier/Bridge/SmsFactor/Tests/SmsFactorTransportFactoryTest.php create mode 100644 src/Symfony/Component/Notifier/Bridge/SmsFactor/Tests/SmsFactorTransportTest.php create mode 100644 src/Symfony/Component/Notifier/Bridge/SmsFactor/composer.json create mode 100644 src/Symfony/Component/Notifier/Bridge/SmsFactor/phpunit.xml.dist diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php index c6b5ea70484a1..0507800c95ff1 100644 --- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php +++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php @@ -159,6 +159,7 @@ use Symfony\Component\Notifier\Bridge\Smsapi\SmsapiTransportFactory; use Symfony\Component\Notifier\Bridge\SmsBiuras\SmsBiurasTransportFactory; use Symfony\Component\Notifier\Bridge\Smsc\SmscTransportFactory; +use Symfony\Component\Notifier\Bridge\SmsFactor\SmsFactorTransportFactory; use Symfony\Component\Notifier\Bridge\SpotHit\SpotHitTransportFactory; use Symfony\Component\Notifier\Bridge\Telegram\TelegramTransportFactory; use Symfony\Component\Notifier\Bridge\Telnyx\TelnyxTransportFactory; @@ -2555,6 +2556,7 @@ private function registerNotifierConfiguration(array $config, ContainerBuilder $ SmsapiTransportFactory::class => 'notifier.transport_factory.smsapi', SmsBiurasTransportFactory::class => 'notifier.transport_factory.sms-biuras', SmscTransportFactory::class => 'notifier.transport_factory.smsc', + SmsFactorTransportFactory::class => 'notifier.transport_factory.sms-factor', SpotHitTransportFactory::class => 'notifier.transport_factory.spot-hit', TelegramTransportFactory::class => 'notifier.transport_factory.telegram', TelnyxTransportFactory::class => 'notifier.transport_factory.telnyx', diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/notifier_transports.php b/src/Symfony/Bundle/FrameworkBundle/Resources/config/notifier_transports.php index 819177c337787..3bdfad006f7f0 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/config/notifier_transports.php +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/notifier_transports.php @@ -51,6 +51,7 @@ use Symfony\Component\Notifier\Bridge\Smsapi\SmsapiTransportFactory; use Symfony\Component\Notifier\Bridge\SmsBiuras\SmsBiurasTransportFactory; use Symfony\Component\Notifier\Bridge\Smsc\SmscTransportFactory; +use Symfony\Component\Notifier\Bridge\SmsFactor\SmsFactorTransportFactory; use Symfony\Component\Notifier\Bridge\SpotHit\SpotHitTransportFactory; use Symfony\Component\Notifier\Bridge\Telegram\TelegramTransportFactory; use Symfony\Component\Notifier\Bridge\Telnyx\TelnyxTransportFactory; @@ -219,6 +220,10 @@ ->parent('notifier.transport_factory.abstract') ->tag('texter.transport_factory') + ->set('notifier.transport_factory.sms-factor', SmsFactorTransportFactory::class) + ->parent('notifier.transport_factory.abstract') + ->tag('texter.transport_factory') + ->set('notifier.transport_factory.message-bird', MessageBirdTransportFactory::class) ->parent('notifier.transport_factory.abstract') ->tag('texter.transport_factory') diff --git a/src/Symfony/Component/Notifier/Bridge/SmsFactor/.gitattributes b/src/Symfony/Component/Notifier/Bridge/SmsFactor/.gitattributes new file mode 100644 index 0000000000000..84c7add058fb5 --- /dev/null +++ b/src/Symfony/Component/Notifier/Bridge/SmsFactor/.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/SmsFactor/.gitignore b/src/Symfony/Component/Notifier/Bridge/SmsFactor/.gitignore new file mode 100644 index 0000000000000..c49a5d8df5c65 --- /dev/null +++ b/src/Symfony/Component/Notifier/Bridge/SmsFactor/.gitignore @@ -0,0 +1,3 @@ +vendor/ +composer.lock +phpunit.xml diff --git a/src/Symfony/Component/Notifier/Bridge/SmsFactor/CHANGELOG.md b/src/Symfony/Component/Notifier/Bridge/SmsFactor/CHANGELOG.md new file mode 100644 index 0000000000000..7174cd7fdeedd --- /dev/null +++ b/src/Symfony/Component/Notifier/Bridge/SmsFactor/CHANGELOG.md @@ -0,0 +1,7 @@ +CHANGELOG +========= + +6.2 +--- + + * Add the bridge diff --git a/src/Symfony/Component/Notifier/Bridge/SmsFactor/LICENSE b/src/Symfony/Component/Notifier/Bridge/SmsFactor/LICENSE new file mode 100644 index 0000000000000..0ece8964f767d --- /dev/null +++ b/src/Symfony/Component/Notifier/Bridge/SmsFactor/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2022 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/SmsFactor/README.md b/src/Symfony/Component/Notifier/Bridge/SmsFactor/README.md new file mode 100644 index 0000000000000..c6ee82a3aadc2 --- /dev/null +++ b/src/Symfony/Component/Notifier/Bridge/SmsFactor/README.md @@ -0,0 +1,19 @@ +SMSFactor Notifier +------------------- + +Provides [SMSFactor](https://www.smsfactor.com/) integration for Symfony Notifier. + +DSN example +----------- + +``` +SMS_FACTOR_DSN=sms-factor://TOKEN@default?sender=SENDER&push_type=PUSH_TYPE +``` + +where: + + - `TOKEN` is your SMSFactor api token + - `SENDER` is the sender name + - `PUSH_TYPE` is the sms type (`alert` or `marketing`) + +See SMSFactor documentation at https://dev.smsfactor.com/ diff --git a/src/Symfony/Component/Notifier/Bridge/SmsFactor/SmsFactorPushType.php b/src/Symfony/Component/Notifier/Bridge/SmsFactor/SmsFactorPushType.php new file mode 100644 index 0000000000000..1ebc1269cfe22 --- /dev/null +++ b/src/Symfony/Component/Notifier/Bridge/SmsFactor/SmsFactorPushType.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Notifier\Bridge\SmsFactor; + +/** + * @author Thibault Buathier + */ +enum SmsFactorPushType: string +{ + case Alert = 'alert'; + case Marketing = 'marketing'; +} diff --git a/src/Symfony/Component/Notifier/Bridge/SmsFactor/SmsFactorTransport.php b/src/Symfony/Component/Notifier/Bridge/SmsFactor/SmsFactorTransport.php new file mode 100644 index 0000000000000..a116a35f97fff --- /dev/null +++ b/src/Symfony/Component/Notifier/Bridge/SmsFactor/SmsFactorTransport.php @@ -0,0 +1,116 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Notifier\Bridge\SmsFactor; + +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\Component\Uid\Uuid; +use Symfony\Contracts\EventDispatcher\EventDispatcherInterface; +use Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface; +use Symfony\Contracts\HttpClient\HttpClientInterface; + +/** + * @author Thibault Buathier + */ +final class SmsFactorTransport extends AbstractTransport +{ + protected const HOST = 'api.smsfactor.com'; + + private string $tokenApi; + private ?string $sender; + private ?SmsFactorPushType $pushType; + + public function __construct(string $tokenApi, ?string $sender, ?SmsFactorPushType $pushType, HttpClientInterface $client = null, EventDispatcherInterface $dispatcher = null) + { + $this->tokenApi = $tokenApi; + $this->sender = $sender; + $this->pushType = $pushType; + + parent::__construct($client, $dispatcher); + } + + public function __toString(): string + { + $arguments = []; + if (null !== $this->sender) { + $arguments[] = sprintf('sender=%s', $this->sender); + } + + if (null !== $this->pushType) { + $arguments[] = sprintf('push_type=%s', $this->pushType->value); + } + + return sprintf('sms-factor://%s?%s', $this->getEndpoint(), implode('&', $arguments)); + } + + 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); + } + + $messageId = Uuid::v4()->toRfc4122(); + $query = [ + 'to' => $message->getPhone(), + 'text' => $message->getSubject(), + 'gsmsmsid' => $messageId, + ]; + + if (null !== $this->sender) { + $query['sender'] = $this->sender; + } + + if (null !== $this->pushType) { + $query['pushtype'] = $this->pushType->value; + } + + $response = $this->client->request('GET', 'https://'.$this->getEndpoint().'/send', [ + 'query' => $query, + 'headers' => [ + 'Authorization' => sprintf('Bearer %s', $this->tokenApi), + 'Accept' => 'application/json', + ], + ]); + + try { + $statusCode = $response->getStatusCode(); + } catch (TransportExceptionInterface $e) { + throw new TransportException('Could not reach the remote SMSFactor server.', $response, 0, $e); + } + + $responseData = $response->toArray(false); + + if (1 !== $responseData['status'] ?? null || 200 !== $statusCode) { + throw new TransportException('Unable to send the SMS: '.$responseData['details'] ?? $responseData['message'] ?? 'Unknown error', $response); + } + if (0 < $responseData['invalid'] ?? 0) { + throw new TransportException('Unable to send the SMS: Invalid phone number', $response); + } + if (1 !== $responseData['sent'] ?? 0) { + throw new TransportException('Unable to send the SMS: Unknown error', $response); + } + + $sentMessage = new SentMessage($message, (string) $this); + $sentMessage->setMessageId($messageId); + + return $sentMessage; + } +} diff --git a/src/Symfony/Component/Notifier/Bridge/SmsFactor/SmsFactorTransportFactory.php b/src/Symfony/Component/Notifier/Bridge/SmsFactor/SmsFactorTransportFactory.php new file mode 100644 index 0000000000000..4d755cc25de98 --- /dev/null +++ b/src/Symfony/Component/Notifier/Bridge/SmsFactor/SmsFactorTransportFactory.php @@ -0,0 +1,57 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Notifier\Bridge\SmsFactor; + +use Symfony\Component\Notifier\Exception\UnsupportedSchemeException; +use Symfony\Component\Notifier\Transport\AbstractTransportFactory; +use Symfony\Component\Notifier\Transport\Dsn; +use Symfony\Component\Notifier\Transport\TransportInterface; + +/** + * @author Thibault Buathier + */ +final class SmsFactorTransportFactory extends AbstractTransportFactory +{ + public function create(Dsn $dsn): SmsFactorTransport + { + $scheme = $dsn->getScheme(); + + if ('sms-factor' !== $scheme) { + throw new UnsupportedSchemeException($dsn, 'sms-factor', $this->getSupportedSchemes()); + } + + $tokenApi = $this->getUser($dsn); + $sender = $dsn->getOption('sender'); + $pushType = $this->getPushType($dsn); + + $host = 'default' === $dsn->getHost() ? null : $dsn->getHost(); + $port = $dsn->getPort(); + + return (new SmsFactorTransport($tokenApi, $sender, $pushType, $this->client, $this->dispatcher))->setHost($host)->setPort($port); + } + + protected function getSupportedSchemes(): array + { + return ['sms-factor']; + } + + private function getPushType(Dsn $dsn): ?SmsFactorPushType + { + $pushType = $dsn->getOption('push_type'); + + if (!is_string($pushType)) { + return null; + } + + return SmsFactorPushType::tryFrom($pushType); + } +} diff --git a/src/Symfony/Component/Notifier/Bridge/SmsFactor/Tests/SmsFactorTransportFactoryTest.php b/src/Symfony/Component/Notifier/Bridge/SmsFactor/Tests/SmsFactorTransportFactoryTest.php new file mode 100644 index 0000000000000..bce11a681a57e --- /dev/null +++ b/src/Symfony/Component/Notifier/Bridge/SmsFactor/Tests/SmsFactorTransportFactoryTest.php @@ -0,0 +1,55 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Notifier\Bridge\SmsFactor\Tests; + +use Symfony\Component\Notifier\Bridge\SmsFactor\SmsFactorTransportFactory; +use Symfony\Component\Notifier\Test\TransportFactoryTestCase; + +final class SmsFactorTransportFactoryTest extends TransportFactoryTestCase +{ + public function createFactory(): SmsFactorTransportFactory + { + return new SmsFactorTransportFactory(); + } + + public function createProvider(): iterable + { + yield [ + 'sms-factor://api.smsfactor.com?sender=MyCompany&push_type=alert', + 'sms-factor://TOKEN@default?push_type=alert&sender=MyCompany', + ]; + yield [ + 'sms-factor://host.test?sender=MyCompany&push_type=marketing', + 'sms-factor://TOKEN@host.test?push_type=marketing&sender=MyCompany', + ]; + } + + public function supportsProvider(): iterable + { + yield [true, 'sms-factor://TOKEN@default?sender=MyCompany&push_type=alert']; + yield [true, 'sms-factor://TOKEN@default?sender=MyCompany&push_type=marketing']; + yield [true, 'sms-factor://TOKEN@default?sender=MyCompany']; + yield [true, 'sms-factor://TOKEN@default']; + yield [true, 'sms-factor://TOKEN@api.example.com']; + yield [false, 'somethingElse://TOKEN@default']; + } + + public function incompleteDsnProvider(): iterable + { + yield 'missing token' => ['sms-factor://default?sender=MyCompany&push_type=marketing']; + } + + public function unsupportedSchemeProvider(): iterable + { + yield ['somethingElse://TOKEN@default']; + } +} diff --git a/src/Symfony/Component/Notifier/Bridge/SmsFactor/Tests/SmsFactorTransportTest.php b/src/Symfony/Component/Notifier/Bridge/SmsFactor/Tests/SmsFactorTransportTest.php new file mode 100644 index 0000000000000..a45c3be63625c --- /dev/null +++ b/src/Symfony/Component/Notifier/Bridge/SmsFactor/Tests/SmsFactorTransportTest.php @@ -0,0 +1,44 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Notifier\Bridge\SmsFactor\Tests; + +use Symfony\Component\Notifier\Bridge\SmsFactor\SmsFactorPushType; +use Symfony\Component\Notifier\Bridge\SmsFactor\SmsFactorTransport; +use Symfony\Component\Notifier\Message\ChatMessage; +use Symfony\Component\Notifier\Message\MessageInterface; +use Symfony\Component\Notifier\Message\SmsMessage; +use Symfony\Component\Notifier\Test\TransportTestCase; +use Symfony\Contracts\HttpClient\HttpClientInterface; + +final class SmsFactorTransportTest extends TransportTestCase +{ + public function createTransport(HttpClientInterface $client = null): SmsFactorTransport + { + return (new SmsFactorTransport('TOKEN', 'MY_COMPANY', SmsFactorPushType::Alert, $client ?? $this->createMock(HttpClientInterface::class)))->setHost('host.test'); + } + + public function toStringProvider(): iterable + { + yield ['sms-factor://host.test?sender=MY_COMPANY&push_type=alert', $this->createTransport()]; + } + + public function supportedMessagesProvider(): iterable + { + yield [new SmsMessage('+33611223344', 'Hello World!')]; + } + + public function unsupportedMessagesProvider(): iterable + { + yield [new ChatMessage('Hello World!')]; + yield [$this->createMock(MessageInterface::class)]; + } +} diff --git a/src/Symfony/Component/Notifier/Bridge/SmsFactor/composer.json b/src/Symfony/Component/Notifier/Bridge/SmsFactor/composer.json new file mode 100644 index 0000000000000..09d3dcda95f46 --- /dev/null +++ b/src/Symfony/Component/Notifier/Bridge/SmsFactor/composer.json @@ -0,0 +1,31 @@ +{ + "name": "symfony/sms-factor-notifier", + "type": "symfony-notifier-bridge", + "description": "Symfony SMSFactor Notifier Bridge", + "keywords": ["sms", "smsfactor", "notifier"], + "homepage": "https://symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "require": { + "php": ">=8.1", + "symfony/http-client": "^5.4|^6.0", + "symfony/notifier": "^5.4|^6.0", + "symfony/uid": "^5.4|^6.0" + }, + "autoload": { + "psr-4": { "Symfony\\Component\\Notifier\\Bridge\\SmsFactor\\": "" }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "minimum-stability": "dev" +} diff --git a/src/Symfony/Component/Notifier/Bridge/SmsFactor/phpunit.xml.dist b/src/Symfony/Component/Notifier/Bridge/SmsFactor/phpunit.xml.dist new file mode 100644 index 0000000000000..3ca6ea5c02f58 --- /dev/null +++ b/src/Symfony/Component/Notifier/Bridge/SmsFactor/phpunit.xml.dist @@ -0,0 +1,31 @@ + + + + + + + + + + ./Tests/ + + + + + + ./ + + ./Resources + ./Tests + ./vendor + + + + diff --git a/src/Symfony/Component/Notifier/Exception/UnsupportedSchemeException.php b/src/Symfony/Component/Notifier/Exception/UnsupportedSchemeException.php index 8358302eeba94..52656929102a8 100644 --- a/src/Symfony/Component/Notifier/Exception/UnsupportedSchemeException.php +++ b/src/Symfony/Component/Notifier/Exception/UnsupportedSchemeException.php @@ -172,6 +172,10 @@ class UnsupportedSchemeException extends LogicException 'class' => Bridge\Smsc\SmscTransportFactory::class, 'package' => 'symfony/smsc-notifier', ], + 'sms-factor' => [ + 'class' => Bridge\SmsFactor\SmsFactorTransportFactory::class, + 'package' => 'symfony/sms-factor-notifier', + ], 'sns' => [ 'class' => Bridge\AmazonSns\AmazonSnsTransportFactory::class, 'package' => 'symfony/amazon-sns-notifier', diff --git a/src/Symfony/Component/Notifier/Tests/Exception/UnsupportedSchemeExceptionTest.php b/src/Symfony/Component/Notifier/Tests/Exception/UnsupportedSchemeExceptionTest.php index cb79d522f9d24..e0f30189795ee 100644 --- a/src/Symfony/Component/Notifier/Tests/Exception/UnsupportedSchemeExceptionTest.php +++ b/src/Symfony/Component/Notifier/Tests/Exception/UnsupportedSchemeExceptionTest.php @@ -49,6 +49,7 @@ use Symfony\Component\Notifier\Bridge\Smsapi\SmsapiTransportFactory; use Symfony\Component\Notifier\Bridge\SmsBiuras\SmsBiurasTransportFactory; use Symfony\Component\Notifier\Bridge\Smsc\SmscTransportFactory; +use Symfony\Component\Notifier\Bridge\SmsFactor\SmsFactorTransportFactory; use Symfony\Component\Notifier\Bridge\SpotHit\SpotHitTransportFactory; use Symfony\Component\Notifier\Bridge\Telegram\TelegramTransportFactory; use Symfony\Component\Notifier\Bridge\Telnyx\TelnyxTransportFactory; @@ -103,6 +104,7 @@ public static function setUpBeforeClass(): void SlackTransportFactory::class => false, Sms77TransportFactory::class => false, SmsapiTransportFactory::class => false, + SmsFactorTransportFactory::class => false, SmsBiurasTransportFactory::class => false, SmscTransportFactory::class => false, SpotHitTransportFactory::class => false, @@ -166,6 +168,7 @@ public function messageWhereSchemeIsPartOfSchemeToPackageMapProvider(): \Generat yield ['smsapi', 'symfony/smsapi-notifier']; yield ['smsbiuras', 'symfony/sms-biuras-notifier']; yield ['smsc', 'symfony/smsc-notifier']; + yield ['sms-factor', 'symfony/sms-factor-notifier']; yield ['spothit', 'symfony/spot-hit-notifier']; yield ['telegram', 'symfony/telegram-notifier']; yield ['telnyx', 'symfony/telnyx-notifier']; diff --git a/src/Symfony/Component/Notifier/Transport.php b/src/Symfony/Component/Notifier/Transport.php index c6f68a29e6f6b..2cb8bae694d5d 100644 --- a/src/Symfony/Component/Notifier/Transport.php +++ b/src/Symfony/Component/Notifier/Transport.php @@ -44,6 +44,7 @@ use Symfony\Component\Notifier\Bridge\Smsapi\SmsapiTransportFactory; use Symfony\Component\Notifier\Bridge\SmsBiuras\SmsBiurasTransportFactory; use Symfony\Component\Notifier\Bridge\Smsc\SmscTransportFactory; +use Symfony\Component\Notifier\Bridge\SmsFactor\SmsFactorTransportFactory; use Symfony\Component\Notifier\Bridge\Telegram\TelegramTransportFactory; use Symfony\Component\Notifier\Bridge\Telnyx\TelnyxTransportFactory; use Symfony\Component\Notifier\Bridge\TurboSms\TurboSmsTransportFactory; @@ -101,6 +102,7 @@ final class Transport SmsapiTransportFactory::class, SmsBiurasTransportFactory::class, SmscTransportFactory::class, + SmsFactorTransportFactory::class, TelegramTransportFactory::class, TelnyxTransportFactory::class, TurboSmsTransportFactory::class,