Skip to content

Commit 7934efe

Browse files
Merge pull request #37 from xabbuh/issue-36
do not search for service_container references
2 parents 8174a0d + 2511cfa commit 7934efe

File tree

3 files changed

+51
-2
lines changed

3 files changed

+51
-2
lines changed

ArgumentValidator.php

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,13 @@ private function validateReferenceArgument($className, Reference $reference)
7474
{
7575
// the __toString method of a Reference is the referenced service id
7676
$referencedServiceId = (string)$reference;
77-
$definition = $this->containerBuilder->findDefinition($referencedServiceId);
78-
// we don't have to check if the definition exists, since the ContainerBuilder itself does that already
77+
78+
if ('service_container' !== $referencedServiceId) {
79+
$definition = $this->containerBuilder->findDefinition($referencedServiceId);
80+
// we don't have to check if the definition exists, since the ContainerBuilder itself does that already
81+
} else {
82+
$definition = new Definition('Symfony\Component\DependencyInjection\Container');
83+
}
7984

8085
$this->validateDefinitionArgument($className, $definition);
8186
}

Tests/ArgumentValidatorTest.php

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,38 @@ public function testFailsIfExpressionCouldNotBeEvaluated()
185185
$validator->validate($parameter, $argument);
186186
}
187187

188+
public function testContainerReferenceArgumentDoesNotFail()
189+
{
190+
$class = 'Matthias\SymfonyServiceDefinitionValidator\Tests\Fixtures\ClassWithContainerInterfaceConstructorArgument';
191+
192+
$parameter = new \ReflectionParameter(array($class, '__construct'), 'container');
193+
$argument = new Reference('service_container');
194+
195+
$validator = new ArgumentValidator(new ContainerBuilder(), $this->createMockResultingClassResolver());
196+
197+
$validator->validate($parameter, $argument);
198+
}
199+
200+
public function testFailsIfContainerReferenceArgumentIsInjectedForParameterWithIncompatibleTypeHint()
201+
{
202+
$class = 'Matthias\SymfonyServiceDefinitionValidator\Tests\Fixtures\ClassWithTypeHintedConstructorArgument';
203+
204+
$parameter = new \ReflectionParameter(array($class, '__construct'), 'expected');
205+
$argument = new Reference('service_container');
206+
207+
$classResolver = $this->createMockResultingClassResolver();
208+
$classResolver
209+
->expects($this->any())
210+
->method('resolve')
211+
->with(new Definition('Symfony\Component\DependencyInjection\Container'))
212+
->willReturn('Symfony\Component\DependencyInjection\Container');
213+
$validator = new ArgumentValidator(new ContainerBuilder(), $classResolver);
214+
215+
$this->setExpectedException('Matthias\SymfonyServiceDefinitionValidator\Exception\TypeHintMismatchException', 'ExpectedClass');
216+
217+
$validator->validate($parameter, $argument);
218+
}
219+
188220
private function createMockResultingClassResolver()
189221
{
190222
return $this->getMock('Matthias\SymfonyServiceDefinitionValidator\ResultingClassResolverInterface');
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?php
2+
3+
namespace Matthias\SymfonyServiceDefinitionValidator\Tests\Fixtures;
4+
5+
use Symfony\Component\DependencyInjection\ContainerInterface;
6+
7+
class ClassWithContainerInterfaceConstructorArgument
8+
{
9+
public function __construct(ContainerInterface $container)
10+
{
11+
}
12+
}

0 commit comments

Comments
 (0)