bug #34282 [DI] Dont cache classes with missing parents (nicolas-grekas)

This PR was merged into the 3.4 branch.

Discussion
----------

[DI] Dont cache classes with missing parents

| Q             | A
| ------------- | ---
| Branch?       | 3.4
| Bug fix?      | yes
| New feature?  | no
| Deprecations? | no
| Tickets       | Closes #34239
| License       | MIT
| Doc PR        | -

Commits
-------

1606430cfd [DI] Dont cache classes with missing parents
This commit is contained in:
Nicolas Grekas 2019-11-08 09:30:13 +01:00
commit b8cdc6e6bb
6 changed files with 8 additions and 14 deletions

View File

@ -155,7 +155,7 @@ class ClassExistenceResource implements SelfCheckingResourceInterface, \Serializ
throw $previous;
}
$e = new \ReflectionException("Class $class not found", 0, $previous);
$e = new \ReflectionException(sprintf('Class "%s" not found while loading "%s".', $class, self::$autoloadedClass), 0, $previous);
if (null !== $previous) {
throw $e;

View File

@ -84,7 +84,7 @@ EOF
public function testBadParentWithNoTimestamp()
{
$this->expectException('ReflectionException');
$this->expectExceptionMessage('Class Symfony\Component\Config\Tests\Fixtures\MissingParent not found');
$this->expectExceptionMessage('Class "Symfony\Component\Config\Tests\Fixtures\MissingParent" not found while loading "Symfony\Component\Config\Tests\Fixtures\BadParent".');
$res = new ClassExistenceResource(BadParent::class, false);
$res->isFresh(0);

View File

@ -361,7 +361,7 @@ class ContainerBuilder extends Container implements TaggedContainerInterface
return null;
}
$resource = null;
$resource = $classReflector = null;
try {
if (isset($this->classReflectors[$class])) {
@ -376,7 +376,6 @@ class ContainerBuilder extends Container implements TaggedContainerInterface
if ($throw) {
throw $e;
}
$classReflector = false;
}
if ($this->trackResources) {

View File

@ -149,12 +149,7 @@ abstract class FileLoader extends BaseFileLoader
try {
$r = $this->container->getReflectionClass($class);
} catch (\ReflectionException $e) {
$classes[$class] = sprintf(
'While discovering services from namespace "%s", an error was thrown when processing the class "%s": "%s".',
$namespace,
$class,
$e->getMessage()
);
$classes[$class] = $e->getMessage();
continue;
}
// check to make sure the expected class exists

View File

@ -380,7 +380,7 @@ class AutowirePassTest extends TestCase
public function testParentClassNotFoundThrowsException()
{
$this->expectException('Symfony\Component\DependencyInjection\Exception\AutowiringFailedException');
$this->expectExceptionMessage('Cannot autowire service "a": argument "$r" of method "Symfony\Component\DependencyInjection\Tests\Compiler\BadParentTypeHintedArgument::__construct()" has type "Symfony\Component\DependencyInjection\Tests\Compiler\OptionalServiceClass" but this class is missing a parent class (Class Symfony\Bug\NotExistClass not found).');
$this->expectExceptionMessageRegExp('{^Cannot autowire service "a": argument "\$r" of method "(Symfony\\\\Component\\\\DependencyInjection\\\\Tests\\\\Compiler\\\\)BadParentTypeHintedArgument::__construct\(\)" has type "\1OptionalServiceClass" but this class is missing a parent class \(Class "?Symfony\\\\Bug\\\\NotExistClass"? not found}');
$container = new ContainerBuilder();

View File

@ -178,9 +178,9 @@ class FileLoaderTest extends TestCase
$this->assertTrue($container->has(MissingParent::class));
$this->assertSame(
['While discovering services from namespace "Symfony\Component\DependencyInjection\Tests\Fixtures\Prototype\BadClasses\", an error was thrown when processing the class "Symfony\Component\DependencyInjection\Tests\Fixtures\Prototype\BadClasses\MissingParent": "Class Symfony\Component\DependencyInjection\Tests\Fixtures\Prototype\BadClasses\MissingClass not found".'],
$container->getDefinition(MissingParent::class)->getErrors()
$this->assertRegExp(
'{Class "?Symfony\\\\Component\\\\DependencyInjection\\\\Tests\\\\Fixtures\\\\Prototype\\\\BadClasses\\\\MissingClass"? not found}',
$container->getDefinition(MissingParent::class)->getErrors()[0]
);
}