Skip to content

Commit 395264a

Browse files
committed
correct issue with validator failing on class alias as typehint. fixes #43.
all code written by @stloyd refs #44
1 parent 8a57430 commit 395264a

File tree

3 files changed

+30
-2
lines changed

3 files changed

+30
-2
lines changed

ArgumentValidator.php

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -152,8 +152,7 @@ private function validateClass($expectedClassName, $actualClassName)
152152
return;
153153
}
154154

155-
$reflectionClass = new \ReflectionClass($actualClassName);
156-
if (!$reflectionClass->isSubclassOf($expectedClassName)) {
155+
if (!is_a($actualClassName, $expectedClassName, true)) {
157156
throw new TypeHintMismatchException(sprintf(
158157
'Argument for type-hint "%s" points to a service of class "%s"',
159158
$expectedClassName,

Tests/ArgumentValidatorTest.php

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,25 @@ public function testContainerReferenceArgumentDoesNotFail()
197197
$validator->validate($parameter, $argument);
198198
}
199199

200+
public function testPassesWhenArgumentIsClassAlias()
201+
{
202+
class_alias('Matthias\SymfonyServiceDefinitionValidator\Tests\Fixtures\ExpectedClass', 'AliasedExpectedClass');
203+
$class = 'Matthias\SymfonyServiceDefinitionValidator\Tests\Fixtures\ClassWithTypeHintedAliasConstructorArgument';
204+
$this->containerBuilder = new ContainerBuilder();
205+
$definition = new Definition();
206+
$this->containerBuilder->setDefinition('referenced_service', $definition);
207+
$parameter = new \ReflectionParameter(array($class, '__construct'), 'expected');
208+
$argument = new Reference('referenced_service');
209+
$resultingClassResolver = $this->createMockResultingClassResolver();
210+
$resultingClassResolver
211+
->expects($this->once())
212+
->method('resolve')
213+
->with($definition)
214+
->will($this->returnValue('\AliasedExpectedClass'));
215+
$validator = new ArgumentValidator($this->containerBuilder, $resultingClassResolver);
216+
$validator->validate($parameter, $argument);
217+
}
218+
200219
public function testFailsIfContainerReferenceArgumentIsInjectedForParameterWithIncompatibleTypeHint()
201220
{
202221
$class = 'Matthias\SymfonyServiceDefinitionValidator\Tests\Fixtures\ClassWithTypeHintedConstructorArgument';
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?php
2+
3+
namespace Matthias\SymfonyServiceDefinitionValidator\Tests\Fixtures;
4+
5+
class ClassWithTypeHintedAliasConstructorArgument
6+
{
7+
public function __construct(\AliasedExpectedClass $expected)
8+
{
9+
}
10+
}

0 commit comments

Comments
 (0)