2626use Http \Message \StreamFactory \SlimStreamFactory ;
2727use Http \Message \UriFactory \SlimUriFactory ;
2828use Slim \Http \Request as SlimRequest ;
29+ use GuzzleHttp \Client as GuzzleHttp ;
2930use Http \Adapter \Guzzle6 \Client as Guzzle6 ;
3031use Http \Adapter \Guzzle5 \Client as Guzzle5 ;
3132use Http \Client \Curl \Client as Curl ;
@@ -95,6 +96,10 @@ final class CommonClassesStrategy implements DiscoveryStrategy
9596 'class ' => [self ::class, 'symfonyPsr18Instantiate ' ],
9697 'condition ' => [SymfonyPsr18::class, Psr17RequestFactory::class],
9798 ],
99+ [
100+ 'class ' => GuzzleHttp::class,
101+ 'condition ' => GuzzleHttp::class,
102+ ],
98103 [
99104 'class ' => [self ::class, 'buzzInstantiate ' ],
100105 'condition ' => [\Buzz \Client \FileGetContents::class, \Buzz \Message \ResponseBuilder::class],
@@ -108,27 +113,43 @@ final class CommonClassesStrategy implements DiscoveryStrategy
108113 public static function getCandidates ($ type )
109114 {
110115 if (Psr18Client::class === $ type ) {
111- $ candidates = self ::$ classes [PSR18Client::class];
116+ return self ::getPsr18Candidates ();
117+ }
118+
119+ return self ::$ classes [$ type ] ?? [];
120+ }
121+
122+ /**
123+ * @return array The return value is always an array with zero or more elements. Each
124+ * element is an array with two keys ['class' => string, 'condition' => mixed].
125+ */
126+ private static function getPsr18Candidates ()
127+ {
128+ $ candidates = [];
112129
113- // HTTPlug 2.0 clients implements PSR18Client too.
114- foreach (self ::$ classes [HttpClient::class] as $ c ) {
115- try {
116- if (is_subclass_of ($ c ['class ' ], Psr18Client::class)) {
117- $ candidates [] = $ c ;
118- }
119- } catch (\Throwable $ e ) {
120- trigger_error (sprintf ('Got exception "%s (%s)" while checking if a PSR-18 Client is available ' , get_class ($ e ), $ e ->getMessage ()), E_USER_WARNING );
130+ // Guzzle 6 does not implement the PSR-18 client interface, but Guzzle 7 does.
131+ foreach (self ::$ classes [Psr18Client::class] ?? [] as $ c ) {
132+ if (GuzzleHttp::class === $ c ['class ' ]) {
133+ if (defined ('GuzzleHttp\ClientInterface::MAJOR_VERSION ' )) {
134+ $ candidates [] = $ c ;
121135 }
136+ } else {
137+ $ candidates [] = $ c ;
122138 }
123-
124- return $ candidates ;
125139 }
126140
127- if (isset (self ::$ classes [$ type ])) {
128- return self ::$ classes [$ type ];
141+ // HTTPlug 2.0 clients implements PSR18Client too.
142+ foreach (self ::$ classes [HttpClient::class] as $ c ) {
143+ try {
144+ if (is_subclass_of ($ c ['class ' ], Psr18Client::class)) {
145+ $ candidates [] = $ c ;
146+ }
147+ } catch (\Throwable $ e ) {
148+ trigger_error (sprintf ('Got exception "%s (%s)" while checking if a PSR-18 Client is available ' , get_class ($ e ), $ e ->getMessage ()), E_USER_WARNING );
149+ }
129150 }
130151
131- return [] ;
152+ return $ candidates ;
132153 }
133154
134155 public static function buzzInstantiate ()
0 commit comments