feature #36611 Add Notifier SentMessage (jeremyFreeAgent)

This PR was squashed before being merged into the 5.2-dev branch.

Discussion
----------

Add Notifier SentMessage

| Q             | A
| ------------- | ---
| Branch?       | master
| Bug fix?      | no
| New feature?  | yes
| Deprecations? | no
| Tickets       |
| License       | MIT
| Doc PR        | https://github.com/symfony/symfony-docs/pull/13624

Like Mailer, Notifier returns now a SentMessage that contains the messageId (returned by the provider in the response). It contains also the body of the response as array to have more info about price, number of sms sent, status and so on.

- [x] apply to bridges

Commits
-------

5a6f0537ec Add Notifier SentMessage
This commit is contained in:
Fabien Potencier 2020-06-23 09:04:53 +02:00
commit ce8f8a5f18
31 changed files with 242 additions and 52 deletions

View File

@ -16,6 +16,7 @@ use Symfony\Component\Notifier\Exception\LogicException;
use Symfony\Component\Notifier\Exception\TransportException;
use Symfony\Component\Notifier\Message\ChatMessage;
use Symfony\Component\Notifier\Message\MessageInterface;
use Symfony\Component\Notifier\Message\SentMessage;
use Symfony\Component\Notifier\Transport\AbstractTransport;
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
use Symfony\Contracts\HttpClient\HttpClientInterface;
@ -50,7 +51,7 @@ final class FirebaseTransport extends AbstractTransport
return $message instanceof ChatMessage;
}
protected function doSend(MessageInterface $message): void
protected function doSend(MessageInterface $message): SentMessage
{
if (!$message instanceof ChatMessage) {
throw new LogicException(sprintf('The "%s" transport only supports instances of "%s" (instance of "%s" given).', __CLASS__, ChatMessage::class, get_debug_type($message)));
@ -84,5 +85,12 @@ final class FirebaseTransport extends AbstractTransport
if ($jsonContents && isset($jsonContents['results']['error'])) {
throw new TransportException(sprintf('Unable to post the Firebase message: %s.', $jsonContents['error']), $response);
}
$success = $response->toArray(false);
$message = new SentMessage($message, (string) $this);
$message->setMessageId($success['results'][0]['message_id']);
return $message;
}
}

View File

@ -18,7 +18,7 @@
"require": {
"php": ">=7.2.5",
"symfony/http-client": "^4.3|^5.0",
"symfony/notifier": "^5.0"
"symfony/notifier": "^5.2"
},
"autoload": {
"psr-4": { "Symfony\\Component\\Notifier\\Bridge\\Firebase\\": "" },

View File

@ -14,6 +14,7 @@ namespace Symfony\Component\Notifier\Bridge\FreeMobile;
use Symfony\Component\Notifier\Exception\LogicException;
use Symfony\Component\Notifier\Exception\TransportException;
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;
@ -51,7 +52,7 @@ final class FreeMobileTransport extends AbstractTransport
return $message instanceof SmsMessage && $this->phone === $message->getPhone();
}
protected function doSend(MessageInterface $message): void
protected function doSend(MessageInterface $message): SentMessage
{
if (!$this->supports($message)) {
throw new LogicException(sprintf('The "%s" transport only supports instances of "%s" (instance of "%s" given) and configured with your phone number.', __CLASS__, SmsMessage::class, \get_class($message)));
@ -75,5 +76,7 @@ final class FreeMobileTransport extends AbstractTransport
throw new TransportException(sprintf('Unable to send the SMS: error %d: ', $response->getStatusCode()).($errors[$response->getStatusCode()] ?? ''), $response);
}
return new SentMessage($message, (string) $this);
}
}

View File

@ -19,7 +19,7 @@
"require": {
"php": ">=7.2.5",
"symfony/http-client": "^4.3|^5.1",
"symfony/notifier": "^5.1"
"symfony/notifier": "^5.2"
},
"autoload": {
"psr-4": { "Symfony\\Component\\Notifier\\Bridge\\FreeMobile\\": "" },

View File

@ -15,6 +15,7 @@ use Symfony\Component\Notifier\Exception\LogicException;
use Symfony\Component\Notifier\Exception\TransportException;
use Symfony\Component\Notifier\Message\ChatMessage;
use Symfony\Component\Notifier\Message\MessageInterface;
use Symfony\Component\Notifier\Message\SentMessage;
use Symfony\Component\Notifier\Transport\AbstractTransport;
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
use Symfony\Contracts\HttpClient\HttpClientInterface;
@ -50,7 +51,7 @@ final class MattermostTransport extends AbstractTransport
/**
* @see https://api.mattermost.com
*/
protected function doSend(MessageInterface $message): void
protected function doSend(MessageInterface $message): SentMessage
{
if (!$message instanceof ChatMessage) {
throw new LogicException(sprintf('The "%s" transport only supports instances of "%s" (instance of "%s" given).', __CLASS__, ChatMessage::class, get_debug_type($message)));
@ -74,5 +75,12 @@ final class MattermostTransport extends AbstractTransport
throw new TransportException(sprintf('Unable to post the Mattermost message: %s (%s).', $result['message'], $result['id']), $response);
}
$success = $response->toArray(false);
$message = new SentMessage($message, (string) $this);
$message->setMessageId($success['id']);
return $message;
}
}

View File

@ -18,7 +18,7 @@
"require": {
"php": ">=7.2.5",
"symfony/http-client": "^4.3|^5.0",
"symfony/notifier": "^5.0"
"symfony/notifier": "^5.2"
},
"autoload": {
"psr-4": { "Symfony\\Component\\Notifier\\Bridge\\Mattermost\\": "" },

View File

@ -14,6 +14,7 @@ namespace Symfony\Component\Notifier\Bridge\Nexmo;
use Symfony\Component\Notifier\Exception\LogicException;
use Symfony\Component\Notifier\Exception\TransportException;
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;
@ -51,7 +52,7 @@ final class NexmoTransport extends AbstractTransport
return $message instanceof SmsMessage;
}
protected function doSend(MessageInterface $message): void
protected function doSend(MessageInterface $message): SentMessage
{
if (!$message instanceof SmsMessage) {
throw new LogicException(sprintf('The "%s" transport only supports instances of "%s" (instance of "%s" given).', __CLASS__, SmsMessage::class, get_debug_type($message)));
@ -73,5 +74,12 @@ final class NexmoTransport extends AbstractTransport
throw new TransportException('Unable to send the SMS: '.$msg['error-text'].sprintf(' (code %s).', $msg['status']), $response);
}
}
$success = $response->toArray(false);
$message = new SentMessage($message, (string) $this);
$message->setMessageId($success['messages'][0]['message-id']);
return $message;
}
}

View File

@ -18,7 +18,7 @@
"require": {
"php": ">=7.2.5",
"symfony/http-client": "^4.3|^5.0",
"symfony/notifier": "^5.0"
"symfony/notifier": "^5.2"
},
"autoload": {
"psr-4": { "Symfony\\Component\\Notifier\\Bridge\\Nexmo\\": "" },

View File

@ -14,6 +14,7 @@ namespace Symfony\Component\Notifier\Bridge\OvhCloud;
use Symfony\Component\Notifier\Exception\LogicException;
use Symfony\Component\Notifier\Exception\TransportException;
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;
@ -53,7 +54,7 @@ final class OvhCloudTransport extends AbstractTransport
return $message instanceof SmsMessage;
}
protected function doSend(MessageInterface $message): void
protected function doSend(MessageInterface $message): SentMessage
{
if (!$message instanceof SmsMessage) {
throw new LogicException(sprintf('The "%s" transport only supports instances of "%s" (instance of "%s" given).', __CLASS__, SmsMessage::class, get_debug_type($message)));
@ -90,6 +91,13 @@ final class OvhCloudTransport extends AbstractTransport
throw new TransportException(sprintf('Unable to send the SMS: %s.', $error['message']), $response);
}
$success = $response->toArray(false);
$message = new SentMessage($message, (string) $this);
$message->setMessageId($success['ids'][0]);
return $message;
}
/**

View File

@ -18,7 +18,7 @@
"require": {
"php": ">=7.2.5",
"symfony/http-client": "^4.3|^5.0",
"symfony/notifier": "^5.0"
"symfony/notifier": "^5.2"
},
"autoload": {
"psr-4": { "Symfony\\Component\\Notifier\\Bridge\\OvhCloud\\": "" },

View File

@ -15,6 +15,7 @@ use Symfony\Component\Notifier\Exception\LogicException;
use Symfony\Component\Notifier\Exception\TransportException;
use Symfony\Component\Notifier\Message\ChatMessage;
use Symfony\Component\Notifier\Message\MessageInterface;
use Symfony\Component\Notifier\Message\SentMessage;
use Symfony\Component\Notifier\Transport\AbstractTransport;
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
use Symfony\Contracts\HttpClient\HttpClientInterface;
@ -55,7 +56,7 @@ final class RocketChatTransport extends AbstractTransport
/**
* @see https://rocket.chat/docs/administrator-guides/integrations/
*/
protected function doSend(MessageInterface $message): void
protected function doSend(MessageInterface $message): SentMessage
{
if (!$message instanceof ChatMessage) {
throw new LogicException(sprintf('The "%s" transport only supports instances of "%s" (instance of "%s" given).', __CLASS__, ChatMessage::class, get_debug_type($message)));
@ -86,5 +87,12 @@ final class RocketChatTransport extends AbstractTransport
if (!$result['success']) {
throw new TransportException(sprintf('Unable to post the RocketChat message: %s.', $result['error']), $response);
}
$success = $response->toArray(false);
$message = new SentMessage($message, (string) $this);
$message->setMessageId($success['message']['_id']);
return $message;
}
}

View File

@ -18,7 +18,7 @@
"require": {
"php": ">=7.2.5",
"symfony/http-client": "^4.3|^5.0",
"symfony/notifier": "^5.0"
"symfony/notifier": "^5.2"
},
"autoload": {
"psr-4": { "Symfony\\Component\\Notifier\\Bridge\\RocketChat\\": "" },

View File

@ -14,6 +14,7 @@ namespace Symfony\Component\Notifier\Bridge\Sinch;
use Symfony\Component\Notifier\Exception\LogicException;
use Symfony\Component\Notifier\Exception\TransportException;
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;
@ -51,7 +52,7 @@ final class SinchTransport extends AbstractTransport
return $message instanceof SmsMessage;
}
protected function doSend(MessageInterface $message): void
protected function doSend(MessageInterface $message): SentMessage
{
if (!$message instanceof SmsMessage) {
throw new LogicException(sprintf('The "%s" transport only supports instances of "%s" (instance of "%s" given).', __CLASS__, SmsMessage::class, get_debug_type($message)));
@ -72,5 +73,12 @@ final class SinchTransport extends AbstractTransport
throw new TransportException(sprintf('Unable to send the SMS: %s (%s).', $error['text'], $error['code']), $response);
}
$success = $response->toArray(false);
$message = new SentMessage($message, (string) $this);
$message->setMessageId($success['id']);
return $message;
}
}

View File

@ -19,7 +19,7 @@
"php": ">=7.2.5",
"ext-json": "*",
"symfony/http-client": "^4.3|^5.0",
"symfony/notifier": "^5.0"
"symfony/notifier": "^5.2"
},
"autoload": {
"psr-4": { "Symfony\\Component\\Notifier\\Bridge\\Sinch\\": "" },

View File

@ -15,6 +15,7 @@ use Symfony\Component\Notifier\Exception\LogicException;
use Symfony\Component\Notifier\Exception\TransportException;
use Symfony\Component\Notifier\Message\ChatMessage;
use Symfony\Component\Notifier\Message\MessageInterface;
use Symfony\Component\Notifier\Message\SentMessage;
use Symfony\Component\Notifier\Transport\AbstractTransport;
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
use Symfony\Contracts\HttpClient\HttpClientInterface;
@ -58,7 +59,7 @@ final class SlackTransport extends AbstractTransport
return $message instanceof ChatMessage && (null === $message->getOptions() || $message->getOptions() instanceof SlackOptions);
}
protected function doSend(MessageInterface $message): void
protected function doSend(MessageInterface $message): SentMessage
{
if (!$message instanceof ChatMessage) {
throw new LogicException(sprintf('The "%s" transport only supports instances of "%s" (instance of "%s" given).', __CLASS__, ChatMessage::class, get_debug_type($message)));
@ -86,5 +87,7 @@ final class SlackTransport extends AbstractTransport
if ('ok' !== $result) {
throw new TransportException('Unable to post the Slack message: '.$result, $response);
}
return new SentMessage($message, (string) $this);
}
}

View File

@ -18,7 +18,7 @@
"require": {
"php": ">=7.2.5",
"symfony/http-client": "^4.3|^5.0",
"symfony/notifier": "^5.1"
"symfony/notifier": "^5.2"
},
"require-dev": {
"symfony/event-dispatcher": "^4.3|^5.0"

View File

@ -15,6 +15,7 @@ use Symfony\Component\Notifier\Exception\LogicException;
use Symfony\Component\Notifier\Exception\TransportException;
use Symfony\Component\Notifier\Message\ChatMessage;
use Symfony\Component\Notifier\Message\MessageInterface;
use Symfony\Component\Notifier\Message\SentMessage;
use Symfony\Component\Notifier\Transport\AbstractTransport;
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
use Symfony\Contracts\HttpClient\HttpClientInterface;
@ -60,7 +61,7 @@ final class TelegramTransport extends AbstractTransport
/**
* @see https://core.telegram.org/bots/api
*/
protected function doSend(MessageInterface $message): void
protected function doSend(MessageInterface $message): SentMessage
{
if (!$message instanceof ChatMessage) {
throw new LogicException(sprintf('The "%s" transport only supports instances of "%s" (instance of "%s" given).', __CLASS__, ChatMessage::class, get_debug_type($message)));
@ -82,5 +83,12 @@ final class TelegramTransport extends AbstractTransport
throw new TransportException('Unable to post the Telegram message: '.$result['description'].sprintf(' (code %s).', $result['error_code']), $response);
}
$success = $response->toArray(false);
$message = new SentMessage($message, (string) $this);
$message->setMessageId($success['result']['message_id']);
return $message;
}
}

View File

@ -80,9 +80,34 @@ final class TelegramTransportTest extends TestCase
$response->expects($this->exactly(2))
->method('getStatusCode')
->willReturn(200);
$content = <<<JSON
{
"ok": true,
"result": {
"message_id": 1,
"from": {
"id": 12345678,
"first_name": "YourBot",
"username": "YourBot"
},
"chat": {
"id": 1234567890,
"first_name": "John",
"last_name": "Doe",
"username": "JohnDoe",
"type": "private"
},
"date": 1459958199,
"text": "Hello from Bot!"
}
}
JSON;
$response->expects($this->once())
->method('getContent')
->willReturn('');
->willReturn($content)
;
$expectedBody = [
'chat_id' => $channel,
@ -98,7 +123,10 @@ final class TelegramTransportTest extends TestCase
$transport = new TelegramTransport('testToken', $channel, $client);
$transport->send(new ChatMessage('testMessage'));
$sentMessage = $transport->send(new ChatMessage('testMessage'));
$this->assertEquals(1, $sentMessage->getMessageId());
$this->assertEquals('telegram://api.telegram.org?channel=testChannel', $sentMessage->getTransport());
}
public function testSendWithChannelOverride(): void
@ -109,9 +137,33 @@ final class TelegramTransportTest extends TestCase
$response->expects($this->exactly(2))
->method('getStatusCode')
->willReturn(200);
$content = <<<JSON
{
"ok": true,
"result": {
"message_id": 1,
"from": {
"id": 12345678,
"first_name": "YourBot",
"username": "YourBot"
},
"chat": {
"id": 1234567890,
"first_name": "John",
"last_name": "Doe",
"username": "JohnDoe",
"type": "private"
},
"date": 1459958199,
"text": "Hello from Bot!"
}
}
JSON;
$response->expects($this->once())
->method('getContent')
->willReturn('');
->willReturn($content)
;
$expectedBody = [
'chat_id' => $channelOverride,
@ -133,6 +185,9 @@ final class TelegramTransportTest extends TestCase
->method('getRecipientId')
->willReturn($channelOverride);
$transport->send(new ChatMessage('testMessage', $messageOptions));
$sentMessage = $transport->send(new ChatMessage('testMessage', $messageOptions));
$this->assertEquals(1, $sentMessage->getMessageId());
$this->assertEquals('telegram://api.telegram.org?channel=defaultChannel', $sentMessage->getTransport());
}
}

View File

@ -18,7 +18,7 @@
"require": {
"php": ">=7.2.5",
"symfony/http-client": "^4.3|^5.0",
"symfony/notifier": "^5.1"
"symfony/notifier": "^5.2"
},
"require-dev": {
"symfony/event-dispatcher": "^4.3|^5.0"

View File

@ -14,6 +14,7 @@ namespace Symfony\Component\Notifier\Bridge\Twilio;
use Symfony\Component\Notifier\Exception\LogicException;
use Symfony\Component\Notifier\Exception\TransportException;
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;
@ -51,7 +52,7 @@ final class TwilioTransport extends AbstractTransport
return $message instanceof SmsMessage;
}
protected function doSend(MessageInterface $message): void
protected function doSend(MessageInterface $message): SentMessage
{
if (!$message instanceof SmsMessage) {
throw new LogicException(sprintf('The "%s" transport only supports instances of "%s" (instance of "%s" given).', __CLASS__, SmsMessage::class, get_debug_type($message)));
@ -72,5 +73,12 @@ final class TwilioTransport extends AbstractTransport
throw new TransportException('Unable to send the SMS: '.$error['message'].sprintf(' (see %s).', $error['more_info']), $response);
}
$success = $response->toArray(false);
$message = new SentMessage($message, (string) $this);
$message->setMessageId($success['sid']);
return $message;
}
}

View File

@ -18,7 +18,7 @@
"require": {
"php": ">=7.2.5",
"symfony/http-client": "^4.3|^5.0",
"symfony/notifier": "^5.0"
"symfony/notifier": "^5.2"
},
"autoload": {
"psr-4": { "Symfony\\Component\\Notifier\\Bridge\\Twilio\\": "" },

View File

@ -1,6 +1,11 @@
CHANGELOG
=========
5.2.0
-----
* [BC BREAK] The `TransportInterface::send()` and `AbstractTransport::doSend()` methods changed to return a `SentMessage` instance instead of `void`.
5.1.0
-----

View File

@ -16,6 +16,7 @@ use Symfony\Component\EventDispatcher\LegacyEventDispatcherProxy;
use Symfony\Component\Messenger\MessageBusInterface;
use Symfony\Component\Notifier\Event\MessageEvent;
use Symfony\Component\Notifier\Message\MessageInterface;
use Symfony\Component\Notifier\Message\SentMessage;
use Symfony\Component\Notifier\Transport\TransportInterface;
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
@ -47,12 +48,10 @@ final class Chatter implements ChatterInterface
return $this->transport->supports($message);
}
public function send(MessageInterface $message): void
public function send(MessageInterface $message): SentMessage
{
if (null === $this->bus) {
$this->transport->send($message);
return;
return $this->transport->send($message);
}
if (null !== $this->dispatcher) {

View File

@ -0,0 +1,50 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Component\Notifier\Message;
/**
* @author Jérémy Romey <jeremy@free-agent.fr>
*
* @experimental in 5.2
*/
final class SentMessage
{
private $original;
private $transport;
private $messageId;
public function __construct(MessageInterface $original, string $transport)
{
$this->original = $original;
$this->transport = $transport;
}
public function getOriginalMessage(): MessageInterface
{
return $this->original;
}
public function getTransport(): string
{
return $this->transport;
}
public function setMessageId(string $id): void
{
$this->messageId = $id;
}
public function getMessageId(): ?string
{
return $this->messageId;
}
}

View File

@ -15,6 +15,7 @@ use PHPUnit\Framework\TestCase;
use Symfony\Component\Notifier\Exception\InvalidArgumentException;
use Symfony\Component\Notifier\Exception\LogicException;
use Symfony\Component\Notifier\Message\ChatMessage;
use Symfony\Component\Notifier\Message\SentMessage;
use Symfony\Component\Notifier\Transport\TransportInterface;
use Symfony\Component\Notifier\Transport\Transports;
@ -30,9 +31,12 @@ class TransportsTest extends TestCase
$one->method('supports')->with($message)->willReturn(true);
$one->expects($this->once())->method('send');
$one->expects($this->once())->method('send')->willReturn(new SentMessage($message, 'one'));
$transports->send($message);
$sentMessage = $transports->send($message);
$this->assertSame($message, $sentMessage->getOriginalMessage());
$this->assertSame('one', $sentMessage->getTransport());
}
public function testSendToFirstSupportedTransportIfMessageDoesNotDefineATransport(): void
@ -47,10 +51,16 @@ class TransportsTest extends TestCase
$one->method('supports')->with($message)->willReturn(false);
$two->method('supports')->with($message)->willReturn(true);
$one->expects($this->never())->method('send');
$two->expects($this->once())->method('send');
$one->method('send')->with($message)->willReturn(new SentMessage($message, 'one'));
$two->method('send')->with($message)->willReturn(new SentMessage($message, 'two'));
$transports->send($message);
$one->expects($this->never())->method('send');
$two->expects($this->once())->method('send')->willReturn(new SentMessage($message, 'two'));
$sentMessage = $transports->send($message);
$this->assertSame($message, $sentMessage->getOriginalMessage());
$this->assertSame('two', $sentMessage->getTransport());
}
public function testThrowExceptionIfNoSupportedTransportWasFound(): void

View File

@ -16,6 +16,7 @@ use Symfony\Component\EventDispatcher\LegacyEventDispatcherProxy;
use Symfony\Component\Messenger\MessageBusInterface;
use Symfony\Component\Notifier\Event\MessageEvent;
use Symfony\Component\Notifier\Message\MessageInterface;
use Symfony\Component\Notifier\Message\SentMessage;
use Symfony\Component\Notifier\Transport\TransportInterface;
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
@ -47,12 +48,10 @@ final class Texter implements TexterInterface
return $this->transport->supports($message);
}
public function send(MessageInterface $message): void
public function send(MessageInterface $message): SentMessage
{
if (null === $this->bus) {
$this->transport->send($message);
return;
return $this->transport->send($message);
}
if (null !== $this->dispatcher) {

View File

@ -17,6 +17,7 @@ use Symfony\Component\HttpClient\HttpClient;
use Symfony\Component\Notifier\Event\MessageEvent;
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;
@ -69,16 +70,16 @@ abstract class AbstractTransport implements TransportInterface
return $this;
}
public function send(MessageInterface $message): void
public function send(MessageInterface $message): SentMessage
{
if (null !== $this->dispatcher) {
$this->dispatcher->dispatch(new MessageEvent($message));
}
$this->doSend($message);
return $this->doSend($message);
}
abstract protected function doSend(MessageInterface $message): void;
abstract protected function doSend(MessageInterface $message): SentMessage;
protected function getEndpoint(): ?string
{

View File

@ -15,6 +15,7 @@ use Symfony\Component\EventDispatcher\Event;
use Symfony\Component\EventDispatcher\LegacyEventDispatcherProxy;
use Symfony\Component\Notifier\Event\MessageEvent;
use Symfony\Component\Notifier\Message\MessageInterface;
use Symfony\Component\Notifier\Message\SentMessage;
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
/**
@ -31,11 +32,13 @@ class NullTransport implements TransportInterface
$this->dispatcher = class_exists(Event::class) ? LegacyEventDispatcherProxy::decorate($dispatcher) : $dispatcher;
}
public function send(MessageInterface $message): void
public function send(MessageInterface $message): SentMessage
{
if (null !== $this->dispatcher) {
$this->dispatcher->dispatch(new MessageEvent($message));
}
return new SentMessage($message, (string) $this);
}
public function __toString(): string

View File

@ -15,6 +15,7 @@ use Symfony\Component\Notifier\Exception\LogicException;
use Symfony\Component\Notifier\Exception\RuntimeException;
use Symfony\Component\Notifier\Exception\TransportExceptionInterface;
use Symfony\Component\Notifier\Message\MessageInterface;
use Symfony\Component\Notifier\Message\SentMessage;
/**
* Uses several Transports using a round robin algorithm.
@ -63,13 +64,11 @@ class RoundRobinTransport implements TransportInterface
return false;
}
public function send(MessageInterface $message): void
public function send(MessageInterface $message): SentMessage
{
while ($transport = $this->getNextTransport($message)) {
try {
$transport->send($message);
return;
return $transport->send($message);
} catch (TransportExceptionInterface $e) {
$this->deadTransports[$transport] = microtime(true);
}

View File

@ -13,6 +13,7 @@ namespace Symfony\Component\Notifier\Transport;
use Symfony\Component\Notifier\Exception\TransportExceptionInterface;
use Symfony\Component\Notifier\Message\MessageInterface;
use Symfony\Component\Notifier\Message\SentMessage;
/**
* @author Fabien Potencier <fabien@symfony.com>
@ -24,7 +25,7 @@ interface TransportInterface
/**
* @throws TransportExceptionInterface
*/
public function send(MessageInterface $message): void;
public function send(MessageInterface $message): SentMessage;
public function supports(MessageInterface $message): bool;

View File

@ -14,6 +14,7 @@ namespace Symfony\Component\Notifier\Transport;
use Symfony\Component\Notifier\Exception\InvalidArgumentException;
use Symfony\Component\Notifier\Exception\LogicException;
use Symfony\Component\Notifier\Message\MessageInterface;
use Symfony\Component\Notifier\Message\SentMessage;
/**
* @author Fabien Potencier <fabien@symfony.com>
@ -51,17 +52,14 @@ final class Transports implements TransportInterface
return false;
}
public function send(MessageInterface $message): void
public function send(MessageInterface $message): SentMessage
{
if (!$transport = $message->getTransport()) {
foreach ($this->transports as $transport) {
if ($transport->supports($message)) {
$transport->send($message);
return;
return $transport->send($message);
}
}
throw new LogicException(sprintf('None of the available transports support the given message (available transports: "%s").', implode('", "', array_keys($this->transports))));
}
@ -73,6 +71,6 @@ final class Transports implements TransportInterface
throw new LogicException(sprintf('The "%s" transport does not support the given message.', $transport));
}
$this->transports[$transport]->send($message);
return $this->transports[$transport]->send($message);
}
}