Skip to content

Commit b79f25a

Browse files
authored
Merge pull request #45 from zikula/alias-fail-43
correct issue with validator failing on class alias as typehint.
2 parents 8a57430 + 3da9e51 commit b79f25a

File tree

4 files changed

+33
-5
lines changed

4 files changed

+33
-5
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+
}

Tests/Functional/Fixtures/reported_problems.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ services:
22
pdo:
33
class: PDO
44
arguments:
5-
dsn: "mysql:dbname=dbname;host=host"
6-
user: "user"
7-
password: "password"
5+
- "mysql:dbname=dbname;host=host"
6+
- "user"
7+
- "password"
88
calls:
99
- [setAttribute, [3, 2]]
1010

0 commit comments

Comments
 (0)