Skip to content

Commit fc351e8

Browse files
committed
Move discovery to compiler pass
1 parent f851a19 commit fc351e8

File tree

7 files changed

+146
-90
lines changed

7 files changed

+146
-90
lines changed
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
<?php
2+
3+
namespace Http\HttplugBundle\DependencyInjection\Compiler;
4+
5+
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
6+
use Symfony\Component\DependencyInjection\ContainerBuilder;
7+
use Symfony\Component\DependencyInjection\Exception\RuntimeException;
8+
use Symfony\Component\DependencyInjection\Reference;
9+
10+
/**
11+
* Adds fallback and discovery services.
12+
*
13+
* @author Márk Sági-Kazár <mark.sagikazar@gmail.com>
14+
*/
15+
final class DiscoveryPass implements CompilerPassInterface
16+
{
17+
/**
18+
* Fallback services and classes.
19+
*
20+
* @var array
21+
*/
22+
private $services = [
23+
'client' => 'Http\Client\HttpClient',
24+
'message_factory' => 'Http\Message\MessageFactory',
25+
'uri_factory' => 'Http\Message\UriFactory',
26+
'stream_factory' => 'Http\Message\StreamFactory',
27+
];
28+
29+
/**
30+
* {@inheritdoc}
31+
*/
32+
public function process(ContainerBuilder $container)
33+
{
34+
$useDiscovery = false;
35+
36+
foreach ($this->services as $service => $class) {
37+
$serviceId = sprintf('httplug.%s.default', $service);
38+
39+
if (false === $container->has($serviceId)) {
40+
// Register and create factory for the first time
41+
if (false === $useDiscovery) {
42+
$this->registerFactory($container);
43+
44+
$factory = [
45+
new Reference('httplug.factory'),
46+
'find',
47+
];
48+
49+
$useDiscovery = true;
50+
}
51+
52+
$definition = $container->register($serviceId, $class);
53+
54+
$definition->setFactory($factory);
55+
$definition->addArgument($class);
56+
}
57+
}
58+
}
59+
60+
/**
61+
* @param ContainerBuilder $container
62+
*
63+
* @throws RuntimeException
64+
*/
65+
private function registerFactory(ContainerBuilder $container)
66+
{
67+
if (false === $container->has('puli.discovery')) {
68+
throw new RuntimeException(
69+
'You need to install puli/symfony-bundle or add configuration at httplug.classes in order to use this bundle. Refer to http://some.doc'
70+
);
71+
}
72+
73+
$definition = $container->register('httplug.factory', 'Http\HttplugBundle\Util\HttplugFactory');
74+
75+
$definition
76+
->addArgument(new Reference('puli.discovery'))
77+
->setPublic(false)
78+
;
79+
}
80+
}

DependencyInjection/HttplugExtension.php

Lines changed: 0 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ public function load(array $configs, ContainerBuilder $container)
3333

3434
$loader->load('services.xml');
3535
$loader->load('plugins.xml');
36-
$loader->load('discovery.xml');
3736

3837
$enabled = is_bool($config['toolbar']['enabled']) ? $config['toolbar']['enabled'] : $container->hasParameter('kernel.debug') && $container->getParameter('kernel.debug');
3938
if ($enabled) {
@@ -46,23 +45,12 @@ public function load(array $configs, ContainerBuilder $container)
4645
}
4746
}
4847

49-
$useDiscovery = false;
50-
5148
foreach ($config['classes'] as $service => $class) {
5249
if (!empty($class)) {
53-
$container->removeDefinition(sprintf('httplug.%s.default', $service));
5450
$container->register(sprintf('httplug.%s.default', $service), $class);
55-
} else {
56-
// we have to use discovery to find this class
57-
$useDiscovery = true;
5851
}
5952
}
6053

61-
if ($useDiscovery) {
62-
$this->verifyPuliInstalled($container);
63-
$loader->load('puli.xml');
64-
}
65-
6654
foreach ($config['main_alias'] as $type => $id) {
6755
$container->setAlias(sprintf('httplug.%s', $type), $id);
6856
}
@@ -217,20 +205,4 @@ private function configureAuthentication(ContainerBuilder $container, array $con
217205
->addArgument(new Reference($authServiceKey));
218206
}
219207
}
220-
221-
/**
222-
* Verifies that Puli bundle is installed.
223-
*
224-
* @param ContainerBuilder $container
225-
*
226-
* @throws \Exception
227-
*/
228-
private function verifyPuliInstalled(ContainerBuilder $container)
229-
{
230-
if (false === $container->has('puli.discovery')) {
231-
throw new \Exception(
232-
'You need to install puli/symfony-bundle or add configuration at httplug.classes in order to use this bundle. Refer to http://some.doc'
233-
);
234-
}
235-
}
236208
}

HttplugBundle.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
namespace Http\HttplugBundle;
44

5+
use Http\HttplugBundle\DependencyInjection\Compiler\DiscoveryPass;
6+
use Symfony\Component\DependencyInjection\ContainerBuilder;
57
use Symfony\Component\HttpKernel\Bundle\Bundle;
68

79
/**
@@ -10,4 +12,10 @@
1012
*/
1113
class HttplugBundle extends Bundle
1214
{
15+
public function build(ContainerBuilder $container)
16+
{
17+
parent::build($container);
18+
19+
$container->addCompilerPass(new DiscoveryPass());
20+
}
1321
}

Resources/config/discovery.xml

Lines changed: 0 additions & 27 deletions
This file was deleted.

Resources/config/puli.xml

Lines changed: 0 additions & 11 deletions
This file was deleted.
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
<?php
2+
3+
namespace Http\HttplugBundle\Tests\Unit\DependencyInjection\Compiler;
4+
5+
use Http\HttplugBundle\DependencyInjection\Compiler\DiscoveryPass;
6+
use Matthias\SymfonyDependencyInjectionTest\PhpUnit\AbstractCompilerPassTestCase;
7+
use Symfony\Component\DependencyInjection\ContainerBuilder;
8+
use Symfony\Component\DependencyInjection\Definition;
9+
10+
/**
11+
* @author Márk Sági-Kazár <mark.sagikazar@gmail.com>
12+
*/
13+
final class DiscoveryPassTest extends AbstractCompilerPassTestCase
14+
{
15+
protected function registerCompilerPass(ContainerBuilder $container)
16+
{
17+
$container->addCompilerPass(new DiscoveryPass());
18+
}
19+
20+
public function testDiscoveryFallbacks()
21+
{
22+
$this->setDefinition('puli.discovery', new Definition('Puli\Discovery\Api\Discovery'));
23+
24+
$this->compile();
25+
26+
$this->assertContainerBuilderHasService('httplug.factory', 'Http\HttplugBundle\Util\HttplugFactory');
27+
28+
$this->assertContainerBuilderHasService('httplug.client.default', 'Http\Client\HttpClient');
29+
$this->assertContainerBuilderHasService('httplug.message_factory.default', 'Http\Message\MessageFactory');
30+
$this->assertContainerBuilderHasService('httplug.uri_factory.default', 'Http\Message\UriFactory');
31+
$this->assertContainerBuilderHasService('httplug.stream_factory.default', 'Http\Message\StreamFactory');
32+
}
33+
34+
public function testDiscoverypartialFallbacks()
35+
{
36+
$this->setDefinition('puli.discovery', new Definition('Puli\Discovery\Api\Discovery'));
37+
$this->setDefinition('httplug.client.default', new Definition('Http\Adapter\Guzzle6\Client'));
38+
39+
$this->compile();
40+
41+
$this->assertContainerBuilderHasService('httplug.factory', 'Http\HttplugBundle\Util\HttplugFactory');
42+
43+
$this->assertContainerBuilderHasService('httplug.client.default', 'Http\Adapter\Guzzle6\Client');
44+
$this->assertContainerBuilderHasService('httplug.message_factory.default', 'Http\Message\MessageFactory');
45+
$this->assertContainerBuilderHasService('httplug.uri_factory.default', 'Http\Message\UriFactory');
46+
$this->assertContainerBuilderHasService('httplug.stream_factory.default', 'Http\Message\StreamFactory');
47+
}
48+
49+
/**
50+
* Overridden test as we have dependencies in this compiler pass.
51+
*
52+
* @test
53+
*/
54+
public function compilation_should_not_fail_with_empty_container()
55+
{
56+
57+
}
58+
}

Tests/Unit/DependencyInjection/HttplugExtensionTest.php

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
use Http\HttplugBundle\DependencyInjection\HttplugExtension;
66
use Matthias\SymfonyDependencyInjectionTest\PhpUnit\AbstractExtensionTestCase;
7-
use Symfony\Component\DependencyInjection\Definition;
87

98
/**
109
* @author David Buchmann <mail@davidbu.ch>
@@ -20,44 +19,26 @@ protected function getContainerExtensions()
2019

2120
public function testConfigLoadDefault()
2221
{
23-
$this->setDefinition('puli.discovery', new Definition('Puli\Discovery\Api\Discovery'));
24-
2522
$this->load();
2623

2724
foreach (['client', 'message_factory', 'uri_factory', 'stream_factory'] as $type) {
2825
$this->assertContainerBuilderHasAlias("httplug.$type", "httplug.$type.default");
2926
}
30-
31-
$this->assertContainerBuilderHasService('httplug.client.default', 'Http\Client\HttpClient');
32-
$this->assertContainerBuilderHasService('httplug.message_factory.default', 'Http\Message\MessageFactory');
33-
$this->assertContainerBuilderHasService('httplug.uri_factory.default', 'Http\Message\UriFactory');
34-
$this->assertContainerBuilderHasService('httplug.stream_factory.default', 'Http\Message\StreamFactory');
3527
}
3628

3729
public function testConfigLoadClass()
3830
{
39-
$this->setDefinition('puli.discovery', new Definition('Puli\Discovery\Api\Discovery'));
40-
4131
$this->load([
4232
'classes' => [
4333
'client' => 'Http\Adapter\Guzzle6\Client',
4434
],
4535
]);
4636

47-
foreach (['client', 'message_factory', 'uri_factory', 'stream_factory'] as $type) {
48-
$this->assertContainerBuilderHasAlias("httplug.$type", "httplug.$type.default");
49-
}
50-
5137
$this->assertContainerBuilderHasService('httplug.client.default', 'Http\Adapter\Guzzle6\Client');
52-
$this->assertContainerBuilderHasService('httplug.message_factory.default', 'Http\Message\MessageFactory');
53-
$this->assertContainerBuilderHasService('httplug.uri_factory.default', 'Http\Message\UriFactory');
54-
$this->assertContainerBuilderHasService('httplug.stream_factory.default', 'Http\Message\StreamFactory');
5538
}
5639

5740
public function testConfigLoadService()
5841
{
59-
$this->setDefinition('puli.discovery', new Definition('Puli\Discovery\Api\Discovery'));
60-
6142
$this->load([
6243
'main_alias' => [
6344
'client' => 'my_client_service',
@@ -70,10 +51,5 @@ public function testConfigLoadService()
7051
foreach (['client', 'message_factory', 'uri_factory', 'stream_factory'] as $type) {
7152
$this->assertContainerBuilderHasAlias("httplug.$type", "my_{$type}_service");
7253
}
73-
74-
$this->assertContainerBuilderHasService('httplug.client.default', 'Http\Client\HttpClient');
75-
$this->assertContainerBuilderHasService('httplug.message_factory.default', 'Http\Message\MessageFactory');
76-
$this->assertContainerBuilderHasService('httplug.uri_factory.default', 'Http\Message\UriFactory');
77-
$this->assertContainerBuilderHasService('httplug.stream_factory.default', 'Http\Message\StreamFactory');
7854
}
7955
}

0 commit comments

Comments
 (0)