Skip to content

Commit 5b62c39

Browse files
authored
Adding PSR-17 discovery (#120)
* Adding PSR-17 discovery * Added Psr17FactoryDiscovery * Added deprecation notices
1 parent 5e7bf24 commit 5b62c39

File tree

5 files changed

+211
-0
lines changed

5 files changed

+211
-0
lines changed

src/MessageFactoryDiscovery.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
* Finds a Message Factory.
1010
*
1111
* @author Márk Sági-Kazár <mark.sagikazar@gmail.com>
12+
*
13+
* @deprecated This will be removed in 2.0. Consider using Psr17FactoryDiscovery.
1214
*/
1315
final class MessageFactoryDiscovery extends ClassDiscovery
1416
{

src/Psr17FactoryDiscovery.php

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
<?php
2+
3+
namespace Http\Discovery;
4+
5+
use Http\Discovery\Exception\DiscoveryFailedException;
6+
use Psr\Http\Message\RequestFactoryInterface;
7+
use Psr\Http\Message\ResponseFactoryInterface;
8+
use Psr\Http\Message\ServerRequestFactoryInterface;
9+
use Psr\Http\Message\StreamFactoryInterface;
10+
use Psr\Http\Message\UploadedFileFactoryInterface;
11+
use Psr\Http\Message\UriFactoryInterface;
12+
13+
/**
14+
* Finds PSR-17 factories.
15+
*
16+
* @author Tobias Nyholm <tobias.nyholm@gmail.com>
17+
*/
18+
final class Psr17FactoryDiscovery extends ClassDiscovery
19+
{
20+
private static function createException($type, Exception $e)
21+
{
22+
new \Http\Discovery\Exception\NotFoundException(
23+
'No psr-17 '.$type.' found. Install a package from this list: https://packagist.org/providers/psr/http-factory-implementation',
24+
0,
25+
$e
26+
);
27+
}
28+
29+
/**
30+
* @return RequestFactoryInterface
31+
*
32+
* @throws Exception\NotFoundException
33+
*/
34+
public static function findRequestFactory()
35+
{
36+
try {
37+
$messageFactory = static::findOneByType(RequestFactoryInterface::class);
38+
} catch (DiscoveryFailedException $e) {
39+
throw self::createException('request factory', $e);
40+
}
41+
42+
return static::instantiateClass($messageFactory);
43+
}
44+
45+
/**
46+
* @return RequestFactoryInterface
47+
*
48+
* @throws Exception\NotFoundException
49+
*/
50+
public static function findResponseFactory()
51+
{
52+
try {
53+
$messageFactory = static::findOneByType(ResponseFactoryInterface::class);
54+
} catch (DiscoveryFailedException $e) {
55+
throw self::createException('response factory', $e);
56+
}
57+
58+
return static::instantiateClass($messageFactory);
59+
}
60+
61+
/**
62+
* @return ServerRequestFactoryInterface
63+
*
64+
* @throws Exception\NotFoundException
65+
*/
66+
public static function findServerRequestFactory()
67+
{
68+
try {
69+
$messageFactory = static::findOneByType(ServerRequestFactoryInterface::class);
70+
} catch (DiscoveryFailedException $e) {
71+
throw self::createException('server request factory', $e);
72+
}
73+
74+
return static::instantiateClass($messageFactory);
75+
}
76+
77+
/**
78+
* @return StreamFactoryInterface
79+
*
80+
* @throws Exception\NotFoundException
81+
*/
82+
public static function findStreamFactory()
83+
{
84+
try {
85+
$messageFactory = static::findOneByType(StreamFactoryInterface::class);
86+
} catch (DiscoveryFailedException $e) {
87+
throw self::createException('stream factory', $e);
88+
}
89+
90+
return static::instantiateClass($messageFactory);
91+
}
92+
93+
/**
94+
* @return UploadedFileFactoryInterface
95+
*
96+
* @throws Exception\NotFoundException
97+
*/
98+
public static function findUploadedFileFactory()
99+
{
100+
try {
101+
$messageFactory = static::findOneByType(UploadedFileFactoryInterface::class);
102+
} catch (DiscoveryFailedException $e) {
103+
throw self::createException('uploaded file factory', $e);
104+
}
105+
106+
return static::instantiateClass($messageFactory);
107+
}
108+
109+
/**
110+
* @return UriFactoryInterface
111+
*
112+
* @throws Exception\NotFoundException
113+
*/
114+
public static function findUrlFactory()
115+
{
116+
try {
117+
$messageFactory = static::findOneByType(UriFactoryInterface::class);
118+
} catch (DiscoveryFailedException $e) {
119+
throw self::createException('url factory', $e);
120+
}
121+
122+
return static::instantiateClass($messageFactory);
123+
}
124+
}
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
<?php
2+
3+
namespace Http\Discovery\Strategy;
4+
5+
use Psr\Http\Message\RequestFactoryInterface;
6+
use Psr\Http\Message\ResponseFactoryInterface;
7+
use Psr\Http\Message\ServerRequestFactoryInterface;
8+
use Psr\Http\Message\StreamFactoryInterface;
9+
use Psr\Http\Message\UploadedFileFactoryInterface;
10+
use Psr\Http\Message\UriFactoryInterface;
11+
12+
/**
13+
* @internal
14+
*
15+
* @author Tobias Nyholm <tobias.nyholm@gmail.com>
16+
*/
17+
final class CommonPsr17ClassesStrategy implements DiscoveryStrategy
18+
{
19+
/**
20+
* @var array
21+
*/
22+
private static $classes = [
23+
RequestFactoryInterface::class => [
24+
'Nyholm\Psr7\Factory\Psr17Factory',
25+
'Zend\Diactoros\RequestFactory',
26+
'Http\Factory\Diactoros\RequestFactory',
27+
'Http\Factory\Guzzle\RequestFactory',
28+
'Http\Factory\Slim\RequestFactory',
29+
],
30+
ResponseFactoryInterface::class => [
31+
'Nyholm\Psr7\Factory\Psr17Factory',
32+
'Zend\Diactoros\ResponseFactory',
33+
'Http\Factory\Diactoros\ResponseFactory',
34+
'Http\Factory\Guzzle\ResponseFactory',
35+
'Http\Factory\Slim\ResponseFactory',
36+
],
37+
ServerRequestFactoryInterface::class => [
38+
'Nyholm\Psr7\Factory\Psr17Factory',
39+
'Zend\Diactoros\ServerRequestFactory',
40+
'Http\Factory\Diactoros\ServerRequestFactory',
41+
'Http\Factory\Guzzle\ServerRequestFactory',
42+
'Http\Factory\Slim\ServerRequestFactory',
43+
],
44+
StreamFactoryInterface::class => [
45+
'Nyholm\Psr7\Factory\Psr17Factory',
46+
'Zend\Diactoros\StreamFactory',
47+
'Http\Factory\Diactoros\StreamFactory',
48+
'Http\Factory\Guzzle\StreamFactory',
49+
'Http\Factory\Slim\StreamFactory',
50+
],
51+
UploadedFileFactoryInterface::class => [
52+
'Nyholm\Psr7\Factory\Psr17Factory',
53+
'Zend\Diactoros\UploadedFileFactory',
54+
'Http\Factory\Diactoros\UploadedFileFactory',
55+
'Http\Factory\Guzzle\UploadedFileFactory',
56+
'Http\Factory\Slim\UploadedFileFactory',
57+
],
58+
UriFactoryInterface::class => [
59+
'Nyholm\Psr7\Factory\Psr17Factory',
60+
'Zend\Diactoros\UriFactory',
61+
'Http\Factory\Diactoros\UriFactory',
62+
'Http\Factory\Guzzle\UriFactory',
63+
'Http\Factory\Slim\UriFactory',
64+
],
65+
];
66+
67+
/**
68+
* {@inheritdoc}
69+
*/
70+
public static function getCandidates($type)
71+
{
72+
$candidates = [];
73+
if (isset(self::$classes[$type])) {
74+
foreach (self::$classes[$type] as $class) {
75+
$candidates[] = ['class' => $class, 'condition' => [$class]];
76+
}
77+
}
78+
79+
return $candidates;
80+
}
81+
}

src/StreamFactoryDiscovery.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
* Finds a Stream Factory.
1010
*
1111
* @author Михаил Красильников <m.krasilnikov@yandex.ru>
12+
*
13+
* @deprecated This will be removed in 2.0. Consider using Psr17FactoryDiscovery.
1214
*/
1315
final class StreamFactoryDiscovery extends ClassDiscovery
1416
{

src/UriFactoryDiscovery.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
* Finds a URI Factory.
1010
*
1111
* @author David de Boer <david@ddeboer.nl>
12+
*
13+
* @deprecated This will be removed in 2.0. Consider using Psr17FactoryDiscovery.
1214
*/
1315
final class UriFactoryDiscovery extends ClassDiscovery
1416
{

0 commit comments

Comments
 (0)