Completed
Push — master ( 49cd2c...5a0da0 )
by Tobias
01:36
created

CommonClassesStrategy   A

Complexity

Total Complexity 7

Size/Duplication

Total Lines 93
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 2

Test Coverage

Coverage 0%

Importance

Changes 0
Metric Value
wmc 7
lcom 1
cbo 2
dl 0
loc 93
ccs 0
cts 20
cp 0
rs 10
c 0
b 0
f 0

3 Methods

Rating   Name   Duplication   Size   Complexity  
A getCandidates() 0 21 5
A buzzInstantiate() 0 4 1
A symfonyPsr18Instantiate() 0 4 1
1
<?php
2
3
namespace Http\Discovery\Strategy;
4
5
use GuzzleHttp\Promise\Promise;
6
use GuzzleHttp\Psr7\Request as GuzzleRequest;
7
use Http\Client\HttpAsyncClient;
8
use Http\Client\HttpClient;
9
use Http\Discovery\MessageFactoryDiscovery;
10
use Http\Discovery\Psr17FactoryDiscovery;
11
use Http\Message\MessageFactory;
12
use Http\Message\MessageFactory\GuzzleMessageFactory;
13
use Http\Message\StreamFactory;
14
use Http\Message\StreamFactory\GuzzleStreamFactory;
15
use Http\Message\UriFactory;
16
use Http\Message\UriFactory\GuzzleUriFactory;
17
use Http\Message\MessageFactory\DiactorosMessageFactory;
18
use Http\Message\StreamFactory\DiactorosStreamFactory;
19
use Http\Message\UriFactory\DiactorosUriFactory;
20
use Psr\Http\Client\ClientInterface as Psr18Client;
21
use Zend\Diactoros\Request as DiactorosRequest;
22
use Http\Message\MessageFactory\SlimMessageFactory;
23
use Http\Message\StreamFactory\SlimStreamFactory;
24
use Http\Message\UriFactory\SlimUriFactory;
25
use Slim\Http\Request as SlimRequest;
26
use Http\Adapter\Guzzle6\Client as Guzzle6;
27
use Http\Adapter\Guzzle5\Client as Guzzle5;
28
use Http\Client\Curl\Client as Curl;
29
use Http\Client\Socket\Client as Socket;
30
use Http\Adapter\React\Client as React;
31
use Http\Adapter\Buzz\Client as Buzz;
32
use Http\Adapter\Cake\Client as Cake;
33
use Http\Adapter\Zend\Client as Zend;
34
use Http\Adapter\Artax\Client as Artax;
35
use Symfony\Component\HttpClient\HttplugClient as SymfonyHttplug;
36
use Symfony\Component\HttpClient\Psr18Client as SymfonyPsr18;
37
use Nyholm\Psr7\Factory\HttplugFactory as NyholmHttplugFactory;
38
39
/**
40
 * @internal
41
 *
42
 * @author Tobias Nyholm <[email protected]>
43
 */
44
final class CommonClassesStrategy implements DiscoveryStrategy
45
{
46
    /**
47
     * @var array
48
     */
49
    private static $classes = [
50
        MessageFactory::class => [
51
            ['class' => NyholmHttplugFactory::class, 'condition' => [NyholmHttplugFactory::class]],
52
            ['class' => GuzzleMessageFactory::class, 'condition' => [GuzzleRequest::class, GuzzleMessageFactory::class]],
53
            ['class' => DiactorosMessageFactory::class, 'condition' => [DiactorosRequest::class, DiactorosMessageFactory::class]],
54
            ['class' => SlimMessageFactory::class, 'condition' => [SlimRequest::class, SlimMessageFactory::class]],
55
        ],
56
        StreamFactory::class => [
57
            ['class' => NyholmHttplugFactory::class, 'condition' => [NyholmHttplugFactory::class]],
58
            ['class' => GuzzleStreamFactory::class, 'condition' => [GuzzleRequest::class, GuzzleStreamFactory::class]],
59
            ['class' => DiactorosStreamFactory::class, 'condition' => [DiactorosRequest::class, DiactorosStreamFactory::class]],
60
            ['class' => SlimStreamFactory::class, 'condition' => [SlimRequest::class, SlimStreamFactory::class]],
61
        ],
62
        UriFactory::class => [
63
            ['class' => NyholmHttplugFactory::class, 'condition' => [NyholmHttplugFactory::class]],
64
            ['class' => GuzzleUriFactory::class, 'condition' => [GuzzleRequest::class, GuzzleUriFactory::class]],
65
            ['class' => DiactorosUriFactory::class, 'condition' => [DiactorosRequest::class, DiactorosUriFactory::class]],
66
            ['class' => SlimUriFactory::class, 'condition' => [SlimRequest::class, SlimUriFactory::class]],
67
        ],
68
        HttpAsyncClient::class => [
69
            ['class' => SymfonyHttplug::class, 'condition' => [SymfonyHttplug::class, Promise::class]],
70
            ['class' => Guzzle6::class, 'condition' => Guzzle6::class],
71
            ['class' => Curl::class, 'condition' => Curl::class],
72
            ['class' => React::class, 'condition' => React::class],
73
        ],
74
        HttpClient::class => [
75
            ['class' => SymfonyHttplug::class, 'condition' => SymfonyHttplug::class],
76
            ['class' => Guzzle6::class, 'condition' => Guzzle6::class],
77
            ['class' => Guzzle5::class, 'condition' => Guzzle5::class],
78
            ['class' => Curl::class, 'condition' => Curl::class],
79
            ['class' => Socket::class, 'condition' => Socket::class],
80
            ['class' => Buzz::class, 'condition' => Buzz::class],
81
            ['class' => React::class, 'condition' => React::class],
82
            ['class' => Cake::class, 'condition' => Cake::class],
83
            ['class' => Zend::class, 'condition' => Zend::class],
84
            ['class' => Artax::class, 'condition' => Artax::class],
85
            [
86
                'class' => [self::class, 'buzzInstantiate'],
87
                'condition' => [\Buzz\Client\FileGetContents::class, \Buzz\Message\ResponseBuilder::class],
88
            ],
89
        ],
90
        Psr18Client::class => [
91
            [
92
                'class' => [self::class, 'symfonyPsr18Instantiate'],
93
                'condition' => SymfonyPsr18::class,
94
            ],
95
            [
96
                'class' => [self::class, 'buzzInstantiate'],
97
                'condition' => [\Buzz\Client\FileGetContents::class, \Buzz\Message\ResponseBuilder::class],
98
            ],
99
        ],
100
    ];
101
102
    /**
103
     * {@inheritdoc}
104
     */
105
    public static function getCandidates($type)
106
    {
107
        if (Psr18Client::class === $type) {
108
            $candidates = self::$classes[PSR18Client::class];
109
110
            // HTTPlug 2.0 clients implements PSR18Client too.
111
            foreach (self::$classes[HttpClient::class] as $c) {
112
                if (is_subclass_of($c['class'], Psr18Client::class)) {
0 ignored issues
show
Bug introduced by
Due to PHP Bug #53727, is_subclass_of might return inconsistent results on some PHP versions if \Psr\Http\Client\ClientInterface::class can be an interface. If so, you could instead use ReflectionClass::implementsInterface.
Loading history...
113
                    $candidates[] = $c;
114
                }
115
            }
116
117
            return $candidates;
118
        }
119
120
        if (isset(self::$classes[$type])) {
121
            return self::$classes[$type];
122
        }
123
124
        return [];
125
    }
126
127
    public static function buzzInstantiate()
128
    {
129
        return new \Buzz\Client\FileGetContents(MessageFactoryDiscovery::find());
130
    }
131
132
    public static function symfonyPsr18Instantiate()
133
    {
134
        return new SymfonyPsr18(null, Psr17FactoryDiscovery::findResponseFactory(), Psr17FactoryDiscovery::findStreamFactory());
135
    }
136
}
137