* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Notifier\Transport; use Symfony\Component\HttpClient\HttpClient; use Symfony\Component\Notifier\Event\FailedMessageEvent; use Symfony\Component\Notifier\Event\MessageEvent; use Symfony\Component\Notifier\Event\SentMessageEvent; use Symfony\Component\Notifier\Exception\LogicException; use Symfony\Component\Notifier\Message\MessageInterface; use Symfony\Component\Notifier\Message\SentMessage; use Symfony\Contracts\EventDispatcher\EventDispatcherInterface; use Symfony\Contracts\HttpClient\HttpClientInterface; /** * @author Fabien Potencier */ abstract class AbstractTransport implements TransportInterface { protected const HOST = 'localhost'; private ?EventDispatcherInterface $dispatcher; protected ?HttpClientInterface $client; protected ?string $host = null; protected ?int $port = null; public function __construct(?HttpClientInterface $client = null, ?EventDispatcherInterface $dispatcher = null) { $this->client = $client; if (null === $client) { if (!class_exists(HttpClient::class)) { throw new LogicException(sprintf('You cannot use "%s" as the HttpClient component is not installed. Try running "composer require symfony/http-client".', __CLASS__)); } $this->client = HttpClient::create(); } $this->dispatcher = $dispatcher; } /** * @return $this */ public function setHost(?string $host): static { $this->host = $host; return $this; } /** * @return $this */ public function setPort(?int $port): static { $this->port = $port; return $this; } public function send(MessageInterface $message): SentMessage { if (null === $this->dispatcher) { return $this->doSend($message); } $this->dispatcher->dispatch(new MessageEvent($message)); try { $sentMessage = $this->doSend($message); } catch (\Throwable $error) { $this->dispatcher->dispatch(new FailedMessageEvent($message, $error)); throw $error; } $this->dispatcher->dispatch(new SentMessageEvent($sentMessage)); return $sentMessage; } abstract protected function doSend(MessageInterface $message): SentMessage; protected function getEndpoint(): string { return ($this->host ?: $this->getDefaultHost()).($this->port ? ':'.$this->port : ''); } protected function getDefaultHost(): string { return static::HOST; } }