Skip to content

Commit a395a85

Browse files
committed
bug #847 Fix dealing with Definition objects in SetDoctrineAnnotatedPrefixesPass (nicolas-grekas)
This PR was merged into the 1.0-dev branch. Discussion ---------- Fix dealing with Definition objects in SetDoctrineAnnotatedPrefixesPass Fix #845 Can happen when [`DoctrineOrmMappingsPass::createAnnotationMappingDriver()`](https://github.com/doctrine/DoctrineBundle/blob/155a870ecbd035963e6b450e0f235e69c48cab30/DependencyInjection/Compiler/DoctrineOrmMappingsPass.php#L124) is used in a third-party bundle. Commits ------- 3fff156 Fix dealing with Definition objects in SetDoctrineAnnotatedPrefixesPass
2 parents 24b5149 + 3fff156 commit a395a85

File tree

1 file changed

+29
-7
lines changed

1 file changed

+29
-7
lines changed

src/DependencyInjection/CompilerPass/SetDoctrineAnnotatedPrefixesPass.php

+29-7
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,11 @@
1111

1212
namespace Symfony\Bundle\MakerBundle\DependencyInjection\CompilerPass;
1313

14+
use Doctrine\ORM\Mapping\Driver\AnnotationDriver;
15+
use Doctrine\Persistence\Mapping\Driver\AnnotationDriver as AbstractAnnotationDriver;
1416
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
1517
use Symfony\Component\DependencyInjection\ContainerBuilder;
18+
use Symfony\Component\DependencyInjection\Definition;
1619
use Symfony\Component\DependencyInjection\Reference;
1720

1821
class SetDoctrineAnnotatedPrefixesPass implements CompilerPassInterface
@@ -35,16 +38,35 @@ public function process(ContainerBuilder $container)
3538
}
3639

3740
$managerName = $m[1];
41+
$methodCalls = $metadataDriverImpl->getMethodCalls();
3842

39-
foreach ($metadataDriverImpl->getMethodCalls() as [$method, $arguments]) {
40-
if ('addDriver' === $method) {
41-
$isAnnotated = 'doctrine.orm.'.$managerName.'_annotation_metadata_driver' === (string) $arguments[0];
42-
$annotatedPrefixes[$managerName][] = [
43-
$arguments[1],
44-
$isAnnotated ? new Reference($arguments[0]) : null,
45-
];
43+
foreach ($methodCalls as $i => [$method, $arguments]) {
44+
if ('addDriver' !== $method) {
45+
continue;
4646
}
47+
48+
if ($arguments[0] instanceof Definition) {
49+
$class = $arguments[0]->getClass();
50+
$namespace = substr($class, 0, strrpos($class, '\\'));
51+
52+
if ('Doctrine\ORM\Mapping\Driver' === $namespace ? AnnotationDriver::class !== $class : !is_subclass_of($class, AbstractAnnotationDriver::class)) {
53+
continue;
54+
}
55+
56+
$id = sprintf('.%d_annotation_metadata_driver~%s', $i, ContainerBuilder::hash($arguments));
57+
$container->setDefinition($id, $arguments[0]);
58+
$arguments[0] = new Reference($id);
59+
$methodCalls[$i] = $arguments;
60+
}
61+
62+
$isAnnotated = false !== strpos($arguments[0], '_annotation_metadata_driver');
63+
$annotatedPrefixes[$managerName][] = [
64+
$arguments[1],
65+
$isAnnotated ? new Reference($arguments[0]) : null,
66+
];
4767
}
68+
69+
$metadataDriverImpl->setMethodCalls($methodCalls);
4870
}
4971

5072
if (null !== $annotatedPrefixes) {

0 commit comments

Comments
 (0)