Skip to content

Commit cc63d13

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

File tree

7 files changed

+138
-89
lines changed

7 files changed

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

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: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
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+
class DiscoveryPassTest extends AbstractCompilerPassTestCase
11+
{
12+
protected function registerCompilerPass(ContainerBuilder $container)
13+
{
14+
$container->addCompilerPass(new DiscoveryPass());
15+
}
16+
17+
public function testDiscoveryFallbacks()
18+
{
19+
$this->setDefinition('puli.discovery', new Definition('Puli\Discovery\Api\Discovery'));
20+
21+
$this->compile();
22+
23+
$this->assertContainerBuilderHasService('httplug.factory', 'Http\HttplugBundle\Util\HttplugFactory');
24+
25+
$this->assertContainerBuilderHasService('httplug.client.default', 'Http\Client\HttpClient');
26+
$this->assertContainerBuilderHasService('httplug.message_factory.default', 'Http\Message\MessageFactory');
27+
$this->assertContainerBuilderHasService('httplug.uri_factory.default', 'Http\Message\UriFactory');
28+
$this->assertContainerBuilderHasService('httplug.stream_factory.default', 'Http\Message\StreamFactory');
29+
}
30+
31+
public function testDiscoverypartialFallbacks()
32+
{
33+
$this->setDefinition('puli.discovery', new Definition('Puli\Discovery\Api\Discovery'));
34+
$this->setDefinition('httplug.client.default', new Definition('Http\Adapter\Guzzle6\Client'));
35+
36+
$this->compile();
37+
38+
$this->assertContainerBuilderHasService('httplug.factory', 'Http\HttplugBundle\Util\HttplugFactory');
39+
40+
$this->assertContainerBuilderHasService('httplug.client.default', 'Http\Adapter\Guzzle6\Client');
41+
$this->assertContainerBuilderHasService('httplug.message_factory.default', 'Http\Message\MessageFactory');
42+
$this->assertContainerBuilderHasService('httplug.uri_factory.default', 'Http\Message\UriFactory');
43+
$this->assertContainerBuilderHasService('httplug.stream_factory.default', 'Http\Message\StreamFactory');
44+
}
45+
46+
/**
47+
* Overridden test as we have dependencies in this compiler pass.
48+
*
49+
* @test
50+
*/
51+
public function compilation_should_not_fail_with_empty_container()
52+
{
53+
54+
}
55+
}

Tests/Unit/DependencyInjection/HttplugExtensionTest.php

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -20,44 +20,26 @@ protected function getContainerExtensions()
2020

2121
public function testConfigLoadDefault()
2222
{
23-
$this->setDefinition('puli.discovery', new Definition('Puli\Discovery\Api\Discovery'));
24-
2523
$this->load();
2624

2725
foreach (['client', 'message_factory', 'uri_factory', 'stream_factory'] as $type) {
2826
$this->assertContainerBuilderHasAlias("httplug.$type", "httplug.$type.default");
2927
}
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');
3528
}
3629

3730
public function testConfigLoadClass()
3831
{
39-
$this->setDefinition('puli.discovery', new Definition('Puli\Discovery\Api\Discovery'));
40-
4132
$this->load([
4233
'classes' => [
4334
'client' => 'Http\Adapter\Guzzle6\Client',
4435
],
4536
]);
4637

47-
foreach (['client', 'message_factory', 'uri_factory', 'stream_factory'] as $type) {
48-
$this->assertContainerBuilderHasAlias("httplug.$type", "httplug.$type.default");
49-
}
50-
5138
$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');
5539
}
5640

5741
public function testConfigLoadService()
5842
{
59-
$this->setDefinition('puli.discovery', new Definition('Puli\Discovery\Api\Discovery'));
60-
6143
$this->load([
6244
'main_alias' => [
6345
'client' => 'my_client_service',
@@ -70,10 +52,5 @@ public function testConfigLoadService()
7052
foreach (['client', 'message_factory', 'uri_factory', 'stream_factory'] as $type) {
7153
$this->assertContainerBuilderHasAlias("httplug.$type", "my_{$type}_service");
7254
}
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');
7855
}
7956
}

0 commit comments

Comments
 (0)