/src/Symfony/Component/Notifier/Transport.php

https://github.com/FabienD/symfony · PHP · 199 lines · 158 code · 21 blank · 20 comment · 4 complexity · c8166d7104adee4c527cd4b08697e86c MD5 · raw file

  1. <?php
  2. /*
  3. * This file is part of the Symfony package.
  4. *
  5. * (c) Fabien Potencier <fabien@symfony.com>
  6. *
  7. * For the full copyright and license information, please view the LICENSE
  8. * file that was distributed with this source code.
  9. */
  10. namespace Symfony\Component\Notifier;
  11. use Symfony\Component\Notifier\Bridge\AllMySms\AllMySmsTransportFactory;
  12. use Symfony\Component\Notifier\Bridge\AmazonSns\AmazonSnsTransportFactory;
  13. use Symfony\Component\Notifier\Bridge\Clickatell\ClickatellTransportFactory;
  14. use Symfony\Component\Notifier\Bridge\Discord\DiscordTransportFactory;
  15. use Symfony\Component\Notifier\Bridge\Engagespot\EngagespotTransportFactory;
  16. use Symfony\Component\Notifier\Bridge\Esendex\EsendexTransportFactory;
  17. use Symfony\Component\Notifier\Bridge\Expo\ExpoTransportFactory;
  18. use Symfony\Component\Notifier\Bridge\Firebase\FirebaseTransportFactory;
  19. use Symfony\Component\Notifier\Bridge\FortySixElks\FortySixElksTransportFactory;
  20. use Symfony\Component\Notifier\Bridge\FreeMobile\FreeMobileTransportFactory;
  21. use Symfony\Component\Notifier\Bridge\GatewayApi\GatewayApiTransportFactory;
  22. use Symfony\Component\Notifier\Bridge\Gitter\GitterTransportFactory;
  23. use Symfony\Component\Notifier\Bridge\Infobip\InfobipTransportFactory;
  24. use Symfony\Component\Notifier\Bridge\Iqsms\IqsmsTransportFactory;
  25. use Symfony\Component\Notifier\Bridge\LightSms\LightSmsTransportFactory;
  26. use Symfony\Component\Notifier\Bridge\Mailjet\MailjetTransportFactory;
  27. use Symfony\Component\Notifier\Bridge\Mattermost\MattermostTransportFactory;
  28. use Symfony\Component\Notifier\Bridge\MessageBird\MessageBirdTransportFactory;
  29. use Symfony\Component\Notifier\Bridge\MessageMedia\MessageMediaTransportFactory;
  30. use Symfony\Component\Notifier\Bridge\MicrosoftTeams\MicrosoftTeamsTransportFactory;
  31. use Symfony\Component\Notifier\Bridge\Mobyt\MobytTransportFactory;
  32. use Symfony\Component\Notifier\Bridge\Octopush\OctopushTransportFactory;
  33. use Symfony\Component\Notifier\Bridge\OrangeSms\OrangeSmsTransportFactory;
  34. use Symfony\Component\Notifier\Bridge\OvhCloud\OvhCloudTransportFactory;
  35. use Symfony\Component\Notifier\Bridge\RocketChat\RocketChatTransportFactory;
  36. use Symfony\Component\Notifier\Bridge\Sendberry\SendberryTransportFactory;
  37. use Symfony\Component\Notifier\Bridge\Sendinblue\SendinblueTransportFactory;
  38. use Symfony\Component\Notifier\Bridge\Sinch\SinchTransportFactory;
  39. use Symfony\Component\Notifier\Bridge\Slack\SlackTransportFactory;
  40. use Symfony\Component\Notifier\Bridge\Sms77\Sms77TransportFactory;
  41. use Symfony\Component\Notifier\Bridge\Smsapi\SmsapiTransportFactory;
  42. use Symfony\Component\Notifier\Bridge\SmsBiuras\SmsBiurasTransportFactory;
  43. use Symfony\Component\Notifier\Bridge\Smsc\SmscTransportFactory;
  44. use Symfony\Component\Notifier\Bridge\Telegram\TelegramTransportFactory;
  45. use Symfony\Component\Notifier\Bridge\Telnyx\TelnyxTransportFactory;
  46. use Symfony\Component\Notifier\Bridge\TurboSms\TurboSmsTransportFactory;
  47. use Symfony\Component\Notifier\Bridge\Twilio\TwilioTransportFactory;
  48. use Symfony\Component\Notifier\Bridge\Vonage\VonageTransportFactory;
  49. use Symfony\Component\Notifier\Bridge\Yunpian\YunpianTransportFactory;
  50. use Symfony\Component\Notifier\Bridge\Zulip\ZulipTransportFactory;
  51. use Symfony\Component\Notifier\Exception\UnsupportedSchemeException;
  52. use Symfony\Component\Notifier\Transport\Dsn;
  53. use Symfony\Component\Notifier\Transport\FailoverTransport;
  54. use Symfony\Component\Notifier\Transport\NullTransportFactory;
  55. use Symfony\Component\Notifier\Transport\RoundRobinTransport;
  56. use Symfony\Component\Notifier\Transport\TransportFactoryInterface;
  57. use Symfony\Component\Notifier\Transport\TransportInterface;
  58. use Symfony\Component\Notifier\Transport\Transports;
  59. use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
  60. use Symfony\Contracts\HttpClient\HttpClientInterface;
  61. /**
  62. * @author Fabien Potencier <fabien@symfony.com>
  63. */
  64. final class Transport
  65. {
  66. private const FACTORY_CLASSES = [
  67. AllMySmsTransportFactory::class,
  68. AmazonSnsTransportFactory::class,
  69. ClickatellTransportFactory::class,
  70. DiscordTransportFactory::class,
  71. EngagespotTransportFactory::class,
  72. EsendexTransportFactory::class,
  73. ExpoTransportFactory::class,
  74. FirebaseTransportFactory::class,
  75. FortySixElksTransportFactory::class,
  76. FreeMobileTransportFactory::class,
  77. GatewayApiTransportFactory::class,
  78. GitterTransportFactory::class,
  79. InfobipTransportFactory::class,
  80. IqsmsTransportFactory::class,
  81. LightSmsTransportFactory::class,
  82. MailjetTransportFactory::class,
  83. MattermostTransportFactory::class,
  84. MessageBirdTransportFactory::class,
  85. MessageMediaTransportFactory::class,
  86. MicrosoftTeamsTransportFactory::class,
  87. MobytTransportFactory::class,
  88. OctopushTransportFactory::class,
  89. OrangeSmsTransportFactory::class,
  90. OvhCloudTransportFactory::class,
  91. RocketChatTransportFactory::class,
  92. SendberryTransportFactory::class,
  93. SendinblueTransportFactory::class,
  94. SinchTransportFactory::class,
  95. SlackTransportFactory::class,
  96. Sms77TransportFactory::class,
  97. SmsapiTransportFactory::class,
  98. SmsBiurasTransportFactory::class,
  99. SmscTransportFactory::class,
  100. TelegramTransportFactory::class,
  101. TelnyxTransportFactory::class,
  102. TurboSmsTransportFactory::class,
  103. TwilioTransportFactory::class,
  104. VonageTransportFactory::class,
  105. YunpianTransportFactory::class,
  106. ZulipTransportFactory::class,
  107. ];
  108. private iterable $factories;
  109. public static function fromDsn(string $dsn, EventDispatcherInterface $dispatcher = null, HttpClientInterface $client = null): TransportInterface
  110. {
  111. $factory = new self(self::getDefaultFactories($dispatcher, $client));
  112. return $factory->fromString($dsn);
  113. }
  114. public static function fromDsns(array $dsns, EventDispatcherInterface $dispatcher = null, HttpClientInterface $client = null): TransportInterface
  115. {
  116. $factory = new self(iterator_to_array(self::getDefaultFactories($dispatcher, $client)));
  117. return $factory->fromStrings($dsns);
  118. }
  119. /**
  120. * @param iterable<mixed, TransportFactoryInterface> $factories
  121. */
  122. public function __construct(iterable $factories)
  123. {
  124. $this->factories = $factories;
  125. }
  126. public function fromStrings(array $dsns): Transports
  127. {
  128. $transports = [];
  129. foreach ($dsns as $name => $dsn) {
  130. $transports[$name] = $this->fromString($dsn);
  131. }
  132. return new Transports($transports);
  133. }
  134. public function fromString(string $dsn): TransportInterface
  135. {
  136. $dsns = preg_split('/\s++\|\|\s++/', $dsn);
  137. if (\count($dsns) > 1) {
  138. return new FailoverTransport($this->createFromDsns($dsns));
  139. }
  140. $dsns = preg_split('/\s++&&\s++/', $dsn);
  141. if (\count($dsns) > 1) {
  142. return new RoundRobinTransport($this->createFromDsns($dsns));
  143. }
  144. return $this->fromDsnObject(new Dsn($dsn));
  145. }
  146. public function fromDsnObject(Dsn $dsn): TransportInterface
  147. {
  148. foreach ($this->factories as $factory) {
  149. if ($factory->supports($dsn)) {
  150. return $factory->create($dsn);
  151. }
  152. }
  153. throw new UnsupportedSchemeException($dsn);
  154. }
  155. /**
  156. * @return TransportInterface[]
  157. */
  158. private function createFromDsns(array $dsns): array
  159. {
  160. $transports = [];
  161. foreach ($dsns as $dsn) {
  162. $transports[] = $this->fromDsnObject(new Dsn($dsn));
  163. }
  164. return $transports;
  165. }
  166. /**
  167. * @return TransportFactoryInterface[]
  168. */
  169. private static function getDefaultFactories(EventDispatcherInterface $dispatcher = null, HttpClientInterface $client = null): iterable
  170. {
  171. foreach (self::FACTORY_CLASSES as $factoryClass) {
  172. if (class_exists($factoryClass)) {
  173. yield new $factoryClass($dispatcher, $client);
  174. }
  175. }
  176. yield new NullTransportFactory($dispatcher, $client);
  177. }
  178. }