Completed
Push — master ( a3be7b...73e550 )
by Tobias
07:13
created

CommonClassesStrategy::symfonyHttplugInstantiate()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 4
ccs 0
cts 0
cp 0
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 0
crap 2
1
<?php
2
3
namespace Http\Discovery\Strategy;
4
5
use GuzzleHttp\Psr7\Request as GuzzleRequest;
6
use Http\Client\HttpAsyncClient;
7
use Http\Client\HttpClient;
8
use Http\Discovery\ClassDiscovery;
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' => Guzzle6::class, 'condition' => Guzzle6::class],
70
            ['class' => Curl::class, 'condition' => Curl::class],
71
            ['class' => React::class, 'condition' => React::class],
72
        ],
73
        HttpClient::class => [
74
            ['class' => Guzzle6::class, 'condition' => Guzzle6::class],
75
            ['class' => Guzzle5::class, 'condition' => Guzzle5::class],
76
            ['class' => Curl::class, 'condition' => Curl::class],
77
            ['class' => Socket::class, 'condition' => Socket::class],
78
            ['class' => Buzz::class, 'condition' => Buzz::class],
79
            ['class' => React::class, 'condition' => React::class],
80
            ['class' => Cake::class, 'condition' => Cake::class],
81
            ['class' => Zend::class, 'condition' => Zend::class],
82
            ['class' => Artax::class, 'condition' => Artax::class],
83
            [
84
                'class' => [self::class, 'buzzInstantiate'],
85
                'condition' => [\Buzz\Client\FileGetContents::class, \Buzz\Message\ResponseBuilder::class],
86
            ],
87
            [
88
                'class' => [self::class, 'symfonyHttplugInstantiate'],
89
                'condition' => SymfonyHttplug::class,
90
            ],
91
        ],
92
        Psr18Client::class => [
93
            [
94
                'class' => [self::class, 'buzzInstantiate'],
95
                'condition' => [\Buzz\Client\FileGetContents::class, \Buzz\Message\ResponseBuilder::class],
96
            ],
97
            [
98
                'class' => [self::class, 'symfonyPsr18Instantiate'],
99
                'condition' => SymfonyPsr18::class,
100
            ],
101
        ],
102
    ];
103
104
    /**
105
     * {@inheritdoc}
106
     */
107
    public static function getCandidates($type)
108
    {
109
        if (Psr18Client::class === $type) {
110
            $candidates = self::$classes[PSR18Client::class];
111
112
            // HTTPlug 2.0 clients implements PSR18Client too.
113
            foreach (self::$classes[HttpClient::class] as $c) {
114
                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...
115
                    $candidates[] = $c;
116
                }
117
            }
118
119
            return $candidates;
120
        }
121
122
        if (isset(self::$classes[$type])) {
123
            return self::$classes[$type];
124
        }
125
126
        return [];
127
    }
128
129
    public static function buzzInstantiate()
130
    {
131
        return new \Buzz\Client\FileGetContents(MessageFactoryDiscovery::find());
132
    }
133
134
    public static function symfonyHttplugInstantiate()
135
    {
136
        return new SymfonyHttplug(null, ClassDiscovery::findOneByType(MessageFactory::class), ClassDiscovery::findOneByType(StreamFactory::class));
0 ignored issues
show
Bug introduced by
The method findOneByType() cannot be called from this context as it is declared protected in class Http\Discovery\ClassDiscovery.

This check looks for access to methods that are not accessible from the current context.

If you need to make a method accessible to another context you can raise its visibility level in the defining class.

Loading history...
137
    }
138
139
    public static function symfonyPsr18Instantiate()
140
    {
141
        return new SymfonyPsr18(null, Psr17FactoryDiscovery::findResponseFactory(), Psr17FactoryDiscovery::findStreamFactory());
142
    }
143
}
144