Skip to content

Commit 6f1f1e2

Browse files
author
Paul M. Jones
committed
Merge pull request #9 from relayphp/add-reusable
Add ReusableRelay
2 parents bc3a3f2 + ae456a1 commit 6f1f1e2

File tree

4 files changed

+120
-0
lines changed

4 files changed

+120
-0
lines changed

src/RelayFactory.php

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?php
2+
namespace Relay;
3+
4+
class RelayFactory
5+
{
6+
protected $queue;
7+
protected $resolver;
8+
9+
public function __construct(array $queue, $resolver = null)
10+
{
11+
$this->queue = $queue;
12+
$this->resolver = $resolver;
13+
}
14+
15+
public function newInstance()
16+
{
17+
return new Relay($this->queue, $this->resolver);
18+
}
19+
}

src/ReusableRelay.php

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?php
2+
namespace Relay;
3+
4+
use Psr\Http\Message\RequestInterface as Request;
5+
use Psr\Http\Message\ResponseInterface as Response;
6+
7+
class ReusableRelay
8+
{
9+
protected $relayFactory;
10+
11+
public function __construct(RelayFactory $relayFactory)
12+
{
13+
$this->relayFactory = $relayFactory;
14+
}
15+
16+
public function __invoke(Request $request, Response $response)
17+
{
18+
$relay = $this->relayFactory->newInstance();
19+
return $relay($request, $response);
20+
}
21+
}

src/ReusableRelayBuilder.php

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
<?php
2+
namespace Relay;
3+
4+
use ArrayObject;
5+
use InvalidArgumentException;
6+
7+
class ReusableRelayBuilder
8+
{
9+
protected $resolver;
10+
11+
public function __construct($resolver = null)
12+
{
13+
$this->resolver = $resolver;
14+
}
15+
16+
public function newInstance($queue)
17+
{
18+
return new ReusableRelay($this->newRelayFactory($queue));
19+
}
20+
21+
protected function newRelayFactory($queue)
22+
{
23+
return new RelayFactory(
24+
$this->getArray($queue),
25+
$this->resolver
26+
);
27+
}
28+
29+
protected function getArray($queue)
30+
{
31+
if (is_array($queue)) {
32+
return $queue;
33+
}
34+
35+
$getArrayCopy = $queue instanceof GetArrayCopyInterface
36+
|| $queue instanceof ArrayObject;
37+
38+
if ($getArrayCopy) {
39+
return $queue->getArrayCopy();
40+
}
41+
42+
throw new InvalidArgumentException();
43+
}
44+
}

tests/ReusableRelayTest.php

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
<?php
2+
namespace Relay;
3+
4+
use Zend\Diactoros\ServerRequestFactory;
5+
use Zend\Diactoros\Response;
6+
7+
class ReusableRelayTest extends \PHPUnit_Framework_TestCase
8+
{
9+
public function test()
10+
{
11+
FakeMiddleware::$count = 0;
12+
13+
$queue[] = new FakeMiddleware();
14+
$queue[] = new FakeMiddleware();
15+
$queue[] = new FakeMiddleware();
16+
17+
$builder = new ReusableRelayBuilder();
18+
$relay = $builder->newInstance($queue);
19+
20+
// relay once
21+
$response = $relay(
22+
ServerRequestFactory::fromGlobals(),
23+
new Response()
24+
);
25+
$actual = (string) $response->getBody();
26+
$this->assertSame('123456', $actual);
27+
28+
// relay again
29+
$response = $relay(
30+
ServerRequestFactory::fromGlobals(),
31+
new Response()
32+
);
33+
$actual = (string) $response->getBody();
34+
$this->assertSame('789101112', $actual);
35+
}
36+
}

0 commit comments

Comments
 (0)