Skip to content

Commit bc3395d

Browse files
authored
Merge pull request #76 from alafon/fix-container-pass
Avoid creating services before compiler passes are all done
2 parents 388d1c4 + a891e2e commit bc3395d

File tree

5 files changed

+119
-3
lines changed

5 files changed

+119
-3
lines changed

DependencyInjection/Compiler/TaggedServiceMappingPass.php

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
namespace Overblog\GraphQLBundle\DependencyInjection\Compiler;
1313

1414
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
15-
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
1615
use Symfony\Component\DependencyInjection\ContainerBuilder;
1716
use Symfony\Component\DependencyInjection\Reference;
1817

@@ -43,9 +42,9 @@ public function process(ContainerBuilder $container)
4342
foreach ($mapping as $name => $options) {
4443
$cleanOptions = $options;
4544
$solutionID = $options['id'];
46-
$solution = $container->get($solutionID);
4745

48-
if ($solution instanceof ContainerAwareInterface) {
46+
$definition = $container->findDefinition($solutionID);
47+
if (is_subclass_of($definition->getClass(), 'Symfony\Component\DependencyInjection\ContainerAwareInterface')) {
4948
$solutionDefinition = $container->findDefinition($options['id']);
5049
$solutionDefinition->addMethodCall('setContainer', [new Reference('service_container')]);
5150
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<?php
2+
3+
namespace Overblog\GraphQLBundle\Tests\DependencyInjection\Compiler;
4+
5+
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
6+
use Symfony\Component\DependencyInjection\ContainerBuilder;
7+
use Symfony\Component\DependencyInjection\Reference;
8+
9+
/**
10+
* Class FakeCompilerPass
11+
* @package DependencyInjection\Compiler
12+
*/
13+
class FakeCompilerPass implements CompilerPassInterface
14+
{
15+
public function process(ContainerBuilder $container)
16+
{
17+
$container
18+
->getDefinition('test_resolver')
19+
->addArgument(new Reference('injected_service'))
20+
;
21+
}
22+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?php
2+
3+
namespace Overblog\GraphQLBundle\Tests\DependencyInjection\Compiler;
4+
5+
/**
6+
* Class FakeInjectedService
7+
*/
8+
class FakeInjectedService
9+
{
10+
public function doSomething()
11+
{
12+
return true;
13+
}
14+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
<?php
2+
3+
namespace Overblog\GraphQLBundle\Tests\DependencyInjection\Compiler;
4+
5+
use Overblog\GraphQLBundle\DependencyInjection\Compiler\ResolverTaggedServiceMappingPass;
6+
use Symfony\Component\DependencyInjection\ContainerBuilder;
7+
use Symfony\Component\DependencyInjection\Definition;
8+
9+
/**
10+
* Class ResolverTaggedServiceMappingPassTest
11+
* @package DependencyInjection
12+
*/
13+
class ResolverTaggedServiceMappingPassTest extends \PHPUnit_Framework_TestCase
14+
{
15+
/**
16+
* @var ContainerBuilder
17+
*/
18+
private $container;
19+
20+
public function setUp()
21+
{
22+
$container = new ContainerBuilder();
23+
$container->setDefinition(
24+
'injected_service',
25+
new Definition('Overblog\GraphQLBundle\Tests\DependencyInjection\Compiler\FakeInjectedService')
26+
);
27+
28+
$container->register(
29+
'overblog_graphql.resolver_resolver',
30+
"Overblog\\GraphQLBundle\\Resolver\\ResolverResolver"
31+
);
32+
33+
$testResolver = new Definition('Overblog\GraphQLBundle\Tests\DependencyInjection\Compiler\ResolverTestService');
34+
$testResolver
35+
->addTag( 'overblog_graphql.resolver', [
36+
'alias' => 'test_resolver', 'method' => 'doSomethingWithContainer'
37+
]);
38+
39+
$container->setDefinition('test_resolver', $testResolver);
40+
41+
$this->container = $container;
42+
}
43+
44+
private function addCompilerPassesAndCompile()
45+
{
46+
$this->container->addCompilerPass(new ResolverTaggedServiceMappingPass());
47+
$this->container->addCompilerPass(new FakeCompilerPass());
48+
$this->container->compile();
49+
}
50+
51+
public function testCompilationWorksPassConfigDirective()
52+
{
53+
$this->addCompilerPassesAndCompile();
54+
55+
$this->assertTrue($this->container->has('test_resolver'));
56+
}
57+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<?php
2+
3+
namespace DependencyInjection\Compiler;
4+
5+
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
6+
use Symfony\Component\DependencyInjection\ContainerAwareTrait;
7+
8+
/**
9+
* Class ResolverTestService
10+
* @package DependencyInjection\Compiler
11+
*/
12+
class ResolverTestService implements ContainerAwareInterface
13+
{
14+
use ContainerAwareTrait;
15+
16+
public function __construct($service)
17+
{
18+
}
19+
20+
public function doSomethingWithContainer()
21+
{
22+
return $this->container->get('injected_service')->doSomething();
23+
}
24+
}

0 commit comments

Comments
 (0)