Skip to content

Commit 51941e0

Browse files
committed
add SentMessageEvent
1 parent f2b98b4 commit 51941e0

File tree

7 files changed

+186
-3
lines changed

7 files changed

+186
-3
lines changed
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <fabien@symfony.com>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace Symfony\Component\Notifier\Event;
13+
14+
use Symfony\Component\Notifier\Message\MessageInterface;
15+
16+
/**
17+
* @author Smaïne Milianni <smaine.milianni@gmail.com>
18+
*/
19+
final class FailedMessageEvent
20+
{
21+
private $message;
22+
private $error;
23+
24+
public function __construct(MessageInterface $message, \Throwable $error)
25+
{
26+
$this->message = $message;
27+
$this->error = $error;
28+
}
29+
30+
public function getMessage(): MessageInterface
31+
{
32+
return $this->message;
33+
}
34+
35+
public function getError(): \Throwable
36+
{
37+
return $this->error;
38+
}
39+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <fabien@symfony.com>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace Symfony\Component\Notifier\Event;
13+
14+
use Symfony\Component\Notifier\Message\SentMessage;
15+
use Symfony\Contracts\EventDispatcher\Event;
16+
17+
/**
18+
* @author Smaïne Milianni <smaine.milianni@gmail.com>
19+
*/
20+
final class SentMessageEvent extends Event
21+
{
22+
private $message;
23+
24+
public function __construct(SentMessage $message)
25+
{
26+
$this->message = $message;
27+
}
28+
29+
public function getMessage(): SentMessage
30+
{
31+
return $this->message;
32+
}
33+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
<?php
2+
3+
namespace Symfony\Component\Notifier\Tests\Event;
4+
5+
use PHPUnit\Framework\TestCase;
6+
use Symfony\Component\Mime\RawMessage;
7+
use Symfony\Component\Notifier\Event\FailedMessageEvent;
8+
use Symfony\Component\Notifier\Message\ChatMessage;
9+
use Symfony\Component\Notifier\Message\EmailMessage;
10+
use Symfony\Component\Notifier\Message\MessageInterface;
11+
use Symfony\Component\Notifier\Message\SmsMessage;
12+
13+
/**
14+
* @author Smaïne Milianni <smaine.milianni@gmail.com>
15+
*/
16+
class FailedMessageEventTest extends TestCase
17+
{
18+
/**
19+
* @dataProvider dataprovider
20+
*/
21+
public function testConstruct(MessageInterface $message, \Throwable $error, FailedMessageEvent $event)
22+
{
23+
$this->assertEquals($event, new FailedMessageEvent($message, $error));
24+
}
25+
26+
/**
27+
* @dataProvider dataprovider
28+
*/
29+
public function testGetMessage(MessageInterface $message, \Throwable $error, FailedMessageEvent $event)
30+
{
31+
$this->assertEquals($message, $event->getMessage());
32+
}
33+
34+
/**
35+
* @dataProvider dataprovider
36+
*/
37+
public function testGetError(MessageInterface $message, \Throwable $error, FailedMessageEvent $event)
38+
{
39+
$this->assertEquals($error, $event->getError());
40+
}
41+
42+
public function dataprovider(): iterable
43+
{
44+
yield [$message = new ChatMessage('subject'), $error = new \RuntimeException(), new FailedMessageEvent($message, $error)];
45+
yield [$message = new EmailMessage(new RawMessage('subject')), $error = new \ErrorException(), new FailedMessageEvent($message, $error)];
46+
yield [$message = new SmsMessage('+3312345678', 'subject'), $error = new \Exception(), new FailedMessageEvent($message, $error)];
47+
}
48+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
<?php
2+
3+
namespace Symfony\Component\Notifier\Tests\Event;
4+
5+
use PHPUnit\Framework\TestCase;
6+
use Symfony\Component\Mime\RawMessage;
7+
use Symfony\Component\Notifier\Event\SentMessageEvent;
8+
use Symfony\Component\Notifier\Message\ChatMessage;
9+
use Symfony\Component\Notifier\Message\EmailMessage;
10+
use Symfony\Component\Notifier\Message\SentMessage;
11+
use Symfony\Component\Notifier\Message\SmsMessage;
12+
13+
/**
14+
* @author Smaïne Milianni <smaine.milianni@gmail.com>
15+
*/
16+
class SentMessageEventTest extends TestCase
17+
{
18+
/**
19+
* @dataProvider dataprovider
20+
*/
21+
public function testConstruct(SentMessage $message, SentMessageEvent $event)
22+
{
23+
$this->assertEquals($event, new SentMessageEvent($message));
24+
}
25+
26+
/**
27+
* @dataProvider dataprovider
28+
*/
29+
public function testGetMessage(SentMessage $message, SentMessageEvent $event)
30+
{
31+
$this->assertEquals($message, $event->getMessage());
32+
}
33+
34+
public function dataprovider(): iterable
35+
{
36+
yield [$message = new SentMessage(new ChatMessage('subject'), 'null_transport'), new SentMessageEvent($message)];
37+
yield [$message = new SentMessage(new EmailMessage(new RawMessage('subject')), 'null_transport'), new SentMessageEvent($message)];
38+
yield [$message = new SentMessage(new SmsMessage('+3312345678', 'subject'), 'null_transport'), new SentMessageEvent($message)];
39+
}
40+
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ public function testSend()
3131
$eventDispatcherMock = $this->createMock(EventDispatcherInterface::class)
3232
);
3333

34-
$eventDispatcherMock->expects($this->once())->method('dispatch');
34+
$eventDispatcherMock->expects($this->exactly(2))->method('dispatch');
3535
$nullTransport->send(new DummyMessage());
3636
}
3737
}

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

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@
1515
use Symfony\Component\EventDispatcher\LegacyEventDispatcherProxy;
1616
use Symfony\Component\HttpClient\HttpClient;
1717
use Symfony\Component\Notifier\Event\MessageEvent;
18+
use Symfony\Component\Notifier\Event\SentMessageEvent;
1819
use Symfony\Component\Notifier\Exception\LogicException;
20+
use Symfony\Component\Notifier\Message\FailedMessageEvent;
1921
use Symfony\Component\Notifier\Message\MessageInterface;
2022
use Symfony\Component\Notifier\Message\SentMessage;
2123
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
@@ -76,7 +78,21 @@ public function send(MessageInterface $message): SentMessage
7678
$this->dispatcher->dispatch(new MessageEvent($message));
7779
}
7880

79-
return $this->doSend($message);
81+
try {
82+
$sentMessage = $this->doSend($message);
83+
} catch (\Throwable $error) {
84+
if (null !== $this->dispatcher) {
85+
$this->dispatcher->dispatch(new FailedMessageEvent($message, $error));
86+
}
87+
88+
throw $error;
89+
}
90+
91+
if (null !== $this->dispatcher) {
92+
$this->dispatcher->dispatch(new SentMessageEvent($sentMessage));
93+
}
94+
95+
return $sentMessage;
8096
}
8197

8298
abstract protected function doSend(MessageInterface $message): SentMessage;

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
use Symfony\Component\EventDispatcher\Event;
1515
use Symfony\Component\EventDispatcher\LegacyEventDispatcherProxy;
1616
use Symfony\Component\Notifier\Event\MessageEvent;
17+
use Symfony\Component\Notifier\Event\SentMessageEvent;
1718
use Symfony\Component\Notifier\Message\MessageInterface;
1819
use Symfony\Component\Notifier\Message\NullMessage;
1920
use Symfony\Component\Notifier\Message\SentMessage;
@@ -41,7 +42,13 @@ public function send(MessageInterface $message): SentMessage
4142
$this->dispatcher->dispatch(new MessageEvent($message));
4243
}
4344

44-
return new SentMessage($message, (string) $this);
45+
$sentMessage = new SentMessage($message, (string) $this);
46+
47+
if (null !== $this->dispatcher) {
48+
$this->dispatcher->dispatch(new SentMessageEvent($sentMessage));
49+
}
50+
51+
return $sentMessage;
4552
}
4653

4754
public function __toString(): string

0 commit comments

Comments
 (0)