Skip to content

Commit ae95a2b

Browse files
committed
bug #591 Fixing a bug where the wrong ManagerRegistry was sometimes used in repositories (weaverryan)
This PR was merged into the 1.0-dev branch. Discussion ---------- Fixing a bug where the wrong ManagerRegistry was sometimes used in repositories This problem occurs if using DoctrineBundle 1.11 or lower, where the newer Persistence alias is not available. This also centralizes the creation of the repository classes to fix this in all places. Problem introduced in #570 Commits ------- 30846ca Fixing a bug where the wrong ManagerRegistry was sometimes used in repositories
2 parents ac73a72 + 30846ca commit ae95a2b

File tree

9 files changed

+89
-31
lines changed

9 files changed

+89
-31
lines changed
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony MakerBundle package.
5+
*
6+
* (c) Fabien Potencier <[email protected]>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace Symfony\Bundle\MakerBundle\DependencyInjection\CompilerPass;
13+
14+
use Doctrine\Persistence\ManagerRegistry;
15+
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
16+
use Symfony\Component\DependencyInjection\ContainerBuilder;
17+
18+
/**
19+
* Helps determine which "ManagerRegistry" autowiring alias is available.
20+
*/
21+
class SetDoctrineManagerRegistryClassPass implements CompilerPassInterface
22+
{
23+
public function process(ContainerBuilder $container)
24+
{
25+
if ($container->hasAlias(ManagerRegistry::class)) {
26+
$definition = $container->getDefinition('maker.entity_class_generator');
27+
$definition->addMethodCall('setMangerRegistryClassName', [ManagerRegistry::class]);
28+
}
29+
}
30+
}

src/Doctrine/EntityClassGenerator.php

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212
namespace Symfony\Bundle\MakerBundle\Doctrine;
1313

1414
use Doctrine\Common\Persistence\ManagerRegistry as LegacyManagerRegistry;
15-
use Doctrine\Persistence\ManagerRegistry;
1615
use Symfony\Bundle\MakerBundle\Generator;
16+
use Symfony\Bundle\MakerBundle\Str;
1717
use Symfony\Bundle\MakerBundle\Util\ClassNameDetails;
1818

1919
/**
@@ -23,6 +23,7 @@ final class EntityClassGenerator
2323
{
2424
private $generator;
2525
private $doctrineHelper;
26+
private $managerRegistryClassName = LegacyManagerRegistry::class;
2627

2728
public function __construct(Generator $generator, DoctrineHelper $doctrineHelper)
2829
{
@@ -51,19 +52,37 @@ public function generateEntityClass(ClassNameDetails $entityClassDetails, bool $
5152
]
5253
);
5354

54-
$entityAlias = strtolower($entityClassDetails->getShortName()[0]);
55-
$this->generator->generateClass(
55+
$this->generateRepositoryClass(
5656
$repoClassDetails->getFullName(),
57+
$entityClassDetails->getFullName(),
58+
$withPasswordUpgrade)
59+
;
60+
61+
return $entityPath;
62+
}
63+
64+
public function generateRepositoryClass(string $repositoryClass, string $entityClass, bool $withPasswordUpgrade)
65+
{
66+
$shortEntityClass = Str::getShortClassName($entityClass);
67+
$entityAlias = strtolower($shortEntityClass[0]);
68+
$this->generator->generateClass(
69+
$repositoryClass,
5770
'doctrine/Repository.tpl.php',
5871
[
59-
'entity_full_class_name' => $entityClassDetails->getFullName(),
60-
'entity_class_name' => $entityClassDetails->getShortName(),
72+
'entity_full_class_name' => $entityClass,
73+
'entity_class_name' => $shortEntityClass,
6174
'entity_alias' => $entityAlias,
6275
'with_password_upgrade' => $withPasswordUpgrade,
63-
'doctrine_registry_class' => interface_exists(ManagerRegistry::class) ? ManagerRegistry::class : LegacyManagerRegistry::class,
76+
'doctrine_registry_class' => $this->managerRegistryClassName,
6477
]
6578
);
79+
}
6680

67-
return $entityPath;
81+
/**
82+
* Called by a compiler pass to inject the non-legacy value if available.
83+
*/
84+
public function setMangerRegistryClassName(string $managerRegistryClassName)
85+
{
86+
$this->managerRegistryClassName = $managerRegistryClassName;
6887
}
6988
}

src/Doctrine/EntityRegenerator.php

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,12 @@
1111

1212
namespace Symfony\Bundle\MakerBundle\Doctrine;
1313

14-
use Doctrine\Common\Persistence\ManagerRegistry as LegacyManagerRegistry;
1514
use Doctrine\Common\Persistence\Mapping\MappingException as CommonMappingException;
1615
use Doctrine\ORM\Mapping\ClassMetadata;
1716
use Doctrine\ORM\Mapping\MappingException;
18-
use Doctrine\Persistence\ManagerRegistry;
1917
use Symfony\Bundle\MakerBundle\Exception\RuntimeCommandException;
2018
use Symfony\Bundle\MakerBundle\FileManager;
2119
use Symfony\Bundle\MakerBundle\Generator;
22-
use Symfony\Bundle\MakerBundle\Str;
2320
use Symfony\Bundle\MakerBundle\Util\ClassSourceManipulator;
2421

2522
/**
@@ -30,13 +27,15 @@ final class EntityRegenerator
3027
private $doctrineHelper;
3128
private $fileManager;
3229
private $generator;
30+
private $entityClassGenerator;
3331
private $overwrite;
3432

35-
public function __construct(DoctrineHelper $doctrineHelper, FileManager $fileManager, Generator $generator, bool $overwrite)
33+
public function __construct(DoctrineHelper $doctrineHelper, FileManager $fileManager, Generator $generator, EntityClassGenerator $entityClassGenerator, bool $overwrite)
3634
{
3735
$this->doctrineHelper = $doctrineHelper;
3836
$this->fileManager = $fileManager;
3937
$this->generator = $generator;
38+
$this->entityClassGenerator = $entityClassGenerator;
4039
$this->overwrite = $overwrite;
4140
}
4241

@@ -226,19 +225,10 @@ private function generateRepository(ClassMetadata $metadata)
226225
return;
227226
}
228227

229-
// duplication in MakeEntity
230-
$entityClassName = Str::getShortClassName($metadata->name);
231-
232-
$this->generator->generateClass(
228+
$this->entityClassGenerator->generateRepositoryClass(
233229
$metadata->customRepositoryClassName,
234-
'doctrine/Repository.tpl.php',
235-
[
236-
'entity_full_class_name' => $metadata->name,
237-
'entity_class_name' => $entityClassName,
238-
'entity_alias' => strtolower($entityClassName[0]),
239-
'with_password_upgrade' => false,
240-
'doctrine_registry_class' => interface_exists(ManagerRegistry::class) ? ManagerRegistry::class : LegacyManagerRegistry::class,
241-
]
230+
$metadata->name,
231+
false
242232
);
243233

244234
$this->generator->writeChanges();

src/Maker/MakeEntity.php

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,9 @@ final class MakeEntity extends AbstractMaker implements InputAwareMakerInterface
4747
private $fileManager;
4848
private $doctrineHelper;
4949
private $generator;
50+
private $entityClassGenerator;
5051

51-
public function __construct(FileManager $fileManager, DoctrineHelper $doctrineHelper, string $projectDirectory, Generator $generator = null)
52+
public function __construct(FileManager $fileManager, DoctrineHelper $doctrineHelper, string $projectDirectory, Generator $generator = null, EntityClassGenerator $entityClassGenerator = null)
5253
{
5354
$this->fileManager = $fileManager;
5455
$this->doctrineHelper = $doctrineHelper;
@@ -60,6 +61,13 @@ public function __construct(FileManager $fileManager, DoctrineHelper $doctrineHe
6061
} else {
6162
$this->generator = $generator;
6263
}
64+
65+
if (null === $entityClassGenerator) {
66+
@trigger_error(sprintf('Passing a "%s" instance as 5th argument is mandatory since version 1.15.1', Generator::class), E_USER_DEPRECATED);
67+
$this->entityClassGenerator = new EntityClassGenerator($generator, $this->doctrineHelper);
68+
} else {
69+
$this->entityClassGenerator = $entityClassGenerator;
70+
}
6371
}
6472

6573
public static function getCommandName(): string
@@ -137,8 +145,7 @@ public function generate(InputInterface $input, ConsoleStyle $io, Generator $gen
137145

138146
$classExists = class_exists($entityClassDetails->getFullName());
139147
if (!$classExists) {
140-
$entityClassGenerator = new EntityClassGenerator($generator, $this->doctrineHelper);
141-
$entityPath = $entityClassGenerator->generateEntityClass(
148+
$entityPath = $this->entityClassGenerator->generateEntityClass(
142149
$entityClassDetails,
143150
$input->getOption('api-resource')
144151
);
@@ -766,7 +773,7 @@ private function isClassInVendor(string $class): bool
766773

767774
private function regenerateEntities(string $classOrNamespace, bool $overwrite, Generator $generator)
768775
{
769-
$regenerator = new EntityRegenerator($this->doctrineHelper, $this->fileManager, $generator, $overwrite);
776+
$regenerator = new EntityRegenerator($this->doctrineHelper, $this->fileManager, $generator, $this->entityClassGenerator, $overwrite);
770777
$regenerator->regenerateEntities($classOrNamespace);
771778
}
772779

src/Maker/MakeUser.php

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,13 +51,15 @@ final class MakeUser extends AbstractMaker
5151
private $configUpdater;
5252

5353
private $doctrineHelper;
54+
private $entityClassGenerator;
5455

55-
public function __construct(FileManager $fileManager, UserClassBuilder $userClassBuilder, SecurityConfigUpdater $configUpdater, DoctrineHelper $doctrineHelper)
56+
public function __construct(FileManager $fileManager, UserClassBuilder $userClassBuilder, SecurityConfigUpdater $configUpdater, DoctrineHelper $doctrineHelper, EntityClassGenerator $entityClassGenerator)
5657
{
5758
$this->fileManager = $fileManager;
5859
$this->userClassBuilder = $userClassBuilder;
5960
$this->configUpdater = $configUpdater;
6061
$this->doctrineHelper = $doctrineHelper;
62+
$this->entityClassGenerator = $entityClassGenerator;
6163
}
6264

6365
public static function getCommandName(): string
@@ -139,8 +141,7 @@ public function generate(InputInterface $input, ConsoleStyle $io, Generator $gen
139141

140142
// A) Generate the User class
141143
if ($userClassConfiguration->isEntity()) {
142-
$entityClassGenerator = new EntityClassGenerator($generator, $this->doctrineHelper);
143-
$classPath = $entityClassGenerator->generateEntityClass(
144+
$classPath = $this->entityClassGenerator->generateEntityClass(
144145
$userClassNameDetails,
145146
false, // api resource
146147
$userClassConfiguration->hasPassword() && interface_exists(PasswordUpgraderInterface::class) // security user

src/MakerBundle.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
use Symfony\Bundle\MakerBundle\DependencyInjection\CompilerPass\MakeCommandRegistrationPass;
1515
use Symfony\Bundle\MakerBundle\DependencyInjection\CompilerPass\RemoveMissingParametersPass;
16+
use Symfony\Bundle\MakerBundle\DependencyInjection\CompilerPass\SetDoctrineManagerRegistryClassPass;
1617
use Symfony\Component\DependencyInjection\Compiler\PassConfig;
1718
use Symfony\Component\DependencyInjection\ContainerBuilder;
1819
use Symfony\Component\HttpKernel\Bundle\Bundle;
@@ -28,5 +29,6 @@ public function build(ContainerBuilder $container)
2829
// add a priority so we run before the core command pass
2930
$container->addCompilerPass(new MakeCommandRegistrationPass(), PassConfig::TYPE_BEFORE_OPTIMIZATION, 10);
3031
$container->addCompilerPass(new RemoveMissingParametersPass());
32+
$container->addCompilerPass(new SetDoctrineManagerRegistryClassPass());
3133
}
3234
}

src/Resources/config/makers.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
<argument type="service" id="maker.doctrine_helper" />
3636
<argument>%kernel.project_dir%</argument>
3737
<argument type="service" id="maker.generator" />
38+
<argument type="service" id="maker.entity_class_generator" />
3839
<tag name="maker.command" />
3940
</service>
4041

@@ -107,6 +108,7 @@
107108
<argument type="service" id="maker.user_class_builder" />
108109
<argument type="service" id="maker.security_config_updater" />
109110
<argument type="service" id="maker.doctrine_helper" />
111+
<argument type="service" id="maker.entity_class_generator" />
110112
<tag name="maker.command" />
111113
</service>
112114

src/Resources/config/services.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848

4949
<service id="maker.entity_class_generator" class="Symfony\Bundle\MakerBundle\Doctrine\EntityClassGenerator">
5050
<argument type="service" id="maker.generator" />
51+
<argument type="service" id="maker.doctrine_helper" />
5152
</service>
5253

5354
<service id="maker.user_class_builder" class="Symfony\Bundle\MakerBundle\Security\UserClassBuilder" />

tests/Doctrine/EntityRegeneratorTest.php

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,12 @@
1212
namespace Symfony\Bundle\MakerBundle\Tests\Doctrine;
1313

1414
use Doctrine\Bundle\DoctrineBundle\DoctrineBundle;
15+
use Doctrine\Persistence\ManagerRegistry;
1516
use PHPUnit\Framework\TestCase;
1617
use Symfony\Bundle\FrameworkBundle\FrameworkBundle;
1718
use Symfony\Bundle\FrameworkBundle\Kernel\MicroKernelTrait;
1819
use Symfony\Bundle\MakerBundle\Doctrine\DoctrineHelper;
20+
use Symfony\Bundle\MakerBundle\Doctrine\EntityClassGenerator;
1921
use Symfony\Bundle\MakerBundle\Doctrine\EntityRegenerator;
2022
use Symfony\Bundle\MakerBundle\FileManager;
2123
use Symfony\Bundle\MakerBundle\Generator;
@@ -110,10 +112,14 @@ private function doTestRegeneration(string $sourceDir, Kernel $kernel, string $n
110112

111113
$fileManager = new FileManager($fs, $autoloaderUtil, $tmpDir);
112114
$doctrineHelper = new DoctrineHelper('App\\Entity', $container->get('doctrine'));
115+
$generator = new Generator($fileManager, 'App\\');
116+
$entityClassGenerator = new EntityClassGenerator($generator, $doctrineHelper);
117+
$entityClassGenerator->setMangerRegistryClassName(ManagerRegistry::class);
113118
$regenerator = new EntityRegenerator(
114119
$doctrineHelper,
115120
$fileManager,
116-
new Generator($fileManager, 'App\\'),
121+
$generator,
122+
$entityClassGenerator,
117123
$overwrite
118124
);
119125

0 commit comments

Comments
 (0)