3
3
namespace Http \HttplugBundle \DependencyInjection \Compiler ;
4
4
5
5
use Http \Client \HttpClient ;
6
- use Http \HttplugBundle \HttplugFactory ;
6
+ use Http \Discovery \HttpClientDiscovery ;
7
+ use Http \Discovery \MessageFactoryDiscovery ;
8
+ use Http \Discovery \StreamFactoryDiscovery ;
9
+ use Http \Discovery \UriFactoryDiscovery ;
7
10
use Http \Message \MessageFactory ;
8
11
use Http \Message \StreamFactory ;
9
12
use Http \Message \UriFactory ;
10
13
use Symfony \Component \DependencyInjection \Compiler \CompilerPassInterface ;
11
14
use Symfony \Component \DependencyInjection \ContainerBuilder ;
12
- use Symfony \Component \DependencyInjection \Exception \RuntimeException ;
13
- use Symfony \Component \DependencyInjection \Reference ;
14
15
15
16
/**
16
17
* Adds fallback and discovery services.
@@ -31,55 +32,32 @@ final class DiscoveryPass implements CompilerPassInterface
31
32
'stream_factory ' => StreamFactory::class,
32
33
];
33
34
35
+ /**
36
+ * Factories by type.
37
+ *
38
+ * @var array
39
+ */
40
+ private $ factoryClasses = [
41
+ 'client ' => HttpClientDiscovery::class,
42
+ 'message_factory ' => MessageFactoryDiscovery::class,
43
+ 'uri_factory ' => UriFactoryDiscovery::class,
44
+ 'stream_factory ' => StreamFactoryDiscovery::class,
45
+ ];
46
+
34
47
/**
35
48
* {@inheritdoc}
36
49
*/
37
50
public function process (ContainerBuilder $ container )
38
51
{
39
- $ useDiscovery = false ;
40
-
41
52
foreach ($ this ->services as $ service => $ class ) {
42
53
$ serviceId = sprintf ('httplug.%s.default ' , $ service );
43
54
44
55
if (false === $ container ->has ($ serviceId )) {
45
- // Register and create factory for the first time
46
- if (false === $ useDiscovery ) {
47
- $ this ->registerFactory ($ container );
48
-
49
- $ factory = [
50
- new Reference ('httplug.factory ' ),
51
- 'find ' ,
52
- ];
53
-
54
- $ useDiscovery = true ;
55
- }
56
-
56
+ // Register and create factory for service
57
57
$ definition = $ container ->register ($ serviceId , $ class );
58
-
59
- $ definition ->setFactory ($ factory );
58
+ $ definition ->setFactory ([$ this ->factoryClasses [$ service ], 'find ' ]);
60
59
$ definition ->addArgument ($ class );
61
60
}
62
61
}
63
62
}
64
-
65
- /**
66
- * @param ContainerBuilder $container
67
- *
68
- * @throws RuntimeException
69
- */
70
- private function registerFactory (ContainerBuilder $ container )
71
- {
72
- if (false === $ container ->has ('puli.discovery ' )) {
73
- throw new RuntimeException (
74
- 'You need to install puli/symfony-bundle or add configuration at httplug.classes in order to use this bundle. Refer to http://docs.php-http.org/en/latest/integrations/symfony-bundle.html#discovery-of-factory-classes '
75
- );
76
- }
77
-
78
- $ definition = $ container ->register ('httplug.factory ' , HttplugFactory::class);
79
-
80
- $ definition
81
- ->addArgument (new Reference ('puli.discovery ' ))
82
- ->setPublic (false )
83
- ;
84
- }
85
63
}
0 commit comments