Skip to content

Commit 170bf32

Browse files
committed
enqueue client extension interface segregation
1 parent 471d3e8 commit 170bf32

10 files changed

Lines changed: 109 additions & 65 deletions

pkg/enqueue/Client/ChainExtension.php

Lines changed: 68 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,46 +5,98 @@
55
final class ChainExtension implements ExtensionInterface
66
{
77
/**
8-
* @var ExtensionInterface[]
8+
* @var PreSendEventExtensionInterface[]
99
*/
10-
private $extensions;
10+
private $preSendEventExtensions;
1111

1212
/**
13-
* @param ExtensionInterface[] $extensions
13+
* @var PreSendCommandExtensionInterface[]
1414
*/
15+
private $preSendCommandExtensions;
16+
17+
/**
18+
* @var DriverPreSendExtensionInterface[]
19+
*/
20+
private $driverPreSendExtensions;
21+
22+
/**
23+
* @var PostSendExtensionInterface[]
24+
*/
25+
private $postSendExtensions;
26+
1527
public function __construct(array $extensions)
1628
{
17-
$this->extensions = [];
18-
array_walk($extensions, function (ExtensionInterface $extension) {
19-
$this->extensions[] = $extension;
29+
$this->preSendEventExtensions = [];
30+
$this->preSendCommandExtensions = [];
31+
$this->driverPreSendExtensions = [];
32+
$this->postSendExtensions = [];
33+
34+
array_walk($extensions, function ($extension) {
35+
if ($extension instanceof ExtensionInterface) {
36+
$this->preSendEventExtensions[] = $extension;
37+
$this->preSendCommandExtensions[] = $extension;
38+
$this->driverPreSendExtensions[] = $extension;
39+
$this->postSendExtensions[] = $extension;
40+
41+
return;
42+
}
43+
44+
$extensionValid = false;
45+
if ($extension instanceof PreSendEventExtensionInterface) {
46+
$this->preSendEventExtensions[] = $extension;
47+
48+
$extensionValid = true;
49+
}
50+
51+
if ($extension instanceof PreSendCommandExtensionInterface) {
52+
$this->preSendCommandExtensions[] = $extension;
53+
54+
$extensionValid = true;
55+
}
56+
57+
if ($extension instanceof DriverPreSendExtensionInterface) {
58+
$this->driverPreSendExtensions[] = $extension;
59+
60+
$extensionValid = true;
61+
}
62+
63+
if ($extension instanceof PostSendExtensionInterface) {
64+
$this->postSendExtensions[] = $extension;
65+
66+
$extensionValid = true;
67+
}
68+
69+
if (false == $extensionValid) {
70+
throw new \LogicException('Invalid extension given');
71+
}
2072
});
2173
}
2274

23-
public function onPreSendEvent(PreSend $event): void
75+
public function onPreSendEvent(PreSend $context): void
2476
{
25-
foreach ($this->extensions as $extension) {
26-
$extension->onPreSendEvent($event);
77+
foreach ($this->preSendEventExtensions as $extension) {
78+
$extension->onPreSendEvent($context);
2779
}
2880
}
2981

30-
public function onPreSendCommand(PreSend $event): void
82+
public function onPreSendCommand(PreSend $context): void
3183
{
32-
foreach ($this->extensions as $extension) {
33-
$extension->onPreSendCommand($event);
84+
foreach ($this->preSendCommandExtensions as $extension) {
85+
$extension->onPreSendCommand($context);
3486
}
3587
}
3688

3789
public function onDriverPreSend(DriverPreSend $context): void
3890
{
39-
foreach ($this->extensions as $extension) {
91+
foreach ($this->driverPreSendExtensions as $extension) {
4092
$extension->onDriverPreSend($context);
4193
}
4294
}
4395

44-
public function onPostSend(PostSend $event): void
96+
public function onPostSend(PostSend $context): void
4597
{
46-
foreach ($this->extensions as $extension) {
47-
$extension->onPostSend($event);
98+
foreach ($this->postSendExtensions as $extension) {
99+
$extension->onPostSend($context);
48100
}
49101
}
50102
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<?php
2+
3+
namespace Enqueue\Client;
4+
5+
interface DriverPreSendExtensionInterface
6+
{
7+
public function onDriverPreSend(DriverPreSend $context): void;
8+
}

pkg/enqueue/Client/EmptyExtensionTrait.php

Lines changed: 0 additions & 22 deletions
This file was deleted.

pkg/enqueue/Client/Extension/PrepareBodyExtension.php

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,14 @@
22

33
namespace Enqueue\Client\Extension;
44

5-
use Enqueue\Client\EmptyExtensionTrait;
6-
use Enqueue\Client\ExtensionInterface;
75
use Enqueue\Client\Message;
86
use Enqueue\Client\PreSend;
7+
use Enqueue\Client\PreSendCommandExtensionInterface;
8+
use Enqueue\Client\PreSendEventExtensionInterface;
99
use Enqueue\Util\JSON;
1010

11-
class PrepareBodyExtension implements ExtensionInterface
11+
class PrepareBodyExtension implements PreSendEventExtensionInterface, PreSendCommandExtensionInterface
1212
{
13-
use EmptyExtensionTrait;
14-
1513
public function onPreSendEvent(PreSend $context): void
1614
{
1715
$this->prepareBody($context->getMessage());

pkg/enqueue/Client/ExtensionInterface.php

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,6 @@
22

33
namespace Enqueue\Client;
44

5-
interface ExtensionInterface
5+
interface ExtensionInterface extends PreSendEventExtensionInterface, PreSendCommandExtensionInterface, DriverPreSendExtensionInterface, PostSendExtensionInterface
66
{
7-
public function onPreSendEvent(PreSend $context): void;
8-
9-
public function onPreSendCommand(PreSend $context): void;
10-
11-
public function onDriverPreSend(DriverPreSend $context): void;
12-
13-
public function onPostSend(PostSend $context): void;
147
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<?php
2+
3+
namespace Enqueue\Client;
4+
5+
interface PostSendExtensionInterface
6+
{
7+
public function onPostSend(PostSend $context): void;
8+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<?php
2+
3+
namespace Enqueue\Client;
4+
5+
interface PreSendCommandExtensionInterface
6+
{
7+
public function onPreSendCommand(PreSend $context): void;
8+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<?php
2+
3+
namespace Enqueue\Client;
4+
5+
interface PreSendEventExtensionInterface
6+
{
7+
public function onPreSendEvent(PreSend $context): void;
8+
}

pkg/enqueue/Tests/Client/ChainExtensionTest.php

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -29,22 +29,15 @@ public function testShouldBeFinal()
2929
$this->assertClassFinal(ChainExtension::class);
3030
}
3131

32-
public function testShouldInitEmptyExtensionsArrayOnConstruct()
33-
{
34-
$extension = new ChainExtension([]);
35-
36-
$this->assertAttributeSame([], 'extensions', $extension);
37-
}
38-
3932
public function testCouldBeConstructedWithExtensionsArray()
4033
{
4134
new ChainExtension([$this->createExtension(), $this->createExtension()]);
4235
}
4336

4437
public function testThrowIfArrayContainsNotExtension()
4538
{
46-
$this->expectException(\TypeError::class);
47-
$this->expectExceptionMessage('Argument 1 passed to');
39+
$this->expectException(\LogicException::class);
40+
$this->expectExceptionMessage('Invalid extension given');
4841

4942
new ChainExtension([$this->createExtension(), new \stdClass()]);
5043
}

pkg/enqueue/Tests/Mocks/CustomPrepareBodyClientExtension.php

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,12 @@
22

33
namespace Enqueue\Tests\Mocks;
44

5-
use Enqueue\Client\EmptyExtensionTrait;
6-
use Enqueue\Client\ExtensionInterface;
75
use Enqueue\Client\PreSend;
6+
use Enqueue\Client\PreSendCommandExtensionInterface;
7+
use Enqueue\Client\PreSendEventExtensionInterface;
88

9-
class CustomPrepareBodyClientExtension implements ExtensionInterface
9+
class CustomPrepareBodyClientExtension implements PreSendEventExtensionInterface, PreSendCommandExtensionInterface
1010
{
11-
use EmptyExtensionTrait;
12-
1311
public function onPreSendCommand(PreSend $context): void
1412
{
1513
$context->getMessage()->setBody('theCommandBodySerializedByCustomExtension');

0 commit comments

Comments
 (0)