diff --git a/src/DependencyInjection/CompilerPass/SetDoctrineManagerRegistryClassPass.php b/src/DependencyInjection/CompilerPass/SetDoctrineManagerRegistryClassPass.php
new file mode 100644
index 000000000..384b49a71
--- /dev/null
+++ b/src/DependencyInjection/CompilerPass/SetDoctrineManagerRegistryClassPass.php
@@ -0,0 +1,30 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\MakerBundle\DependencyInjection\CompilerPass;
+
+use Doctrine\Persistence\ManagerRegistry;
+use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+
+/**
+ * Helps determine which "ManagerRegistry" autowiring alias is available.
+ */
+class SetDoctrineManagerRegistryClassPass implements CompilerPassInterface
+{
+ public function process(ContainerBuilder $container)
+ {
+ if ($container->hasAlias(ManagerRegistry::class)) {
+ $definition = $container->getDefinition('maker.entity_class_generator');
+ $definition->addMethodCall('setMangerRegistryClassName', [ManagerRegistry::class]);
+ }
+ }
+}
diff --git a/src/Doctrine/EntityClassGenerator.php b/src/Doctrine/EntityClassGenerator.php
index 34f374924..f25aa642c 100644
--- a/src/Doctrine/EntityClassGenerator.php
+++ b/src/Doctrine/EntityClassGenerator.php
@@ -12,8 +12,8 @@
namespace Symfony\Bundle\MakerBundle\Doctrine;
use Doctrine\Common\Persistence\ManagerRegistry as LegacyManagerRegistry;
-use Doctrine\Persistence\ManagerRegistry;
use Symfony\Bundle\MakerBundle\Generator;
+use Symfony\Bundle\MakerBundle\Str;
use Symfony\Bundle\MakerBundle\Util\ClassNameDetails;
/**
@@ -23,6 +23,7 @@ final class EntityClassGenerator
{
private $generator;
private $doctrineHelper;
+ private $managerRegistryClassName = LegacyManagerRegistry::class;
public function __construct(Generator $generator, DoctrineHelper $doctrineHelper)
{
@@ -51,19 +52,37 @@ public function generateEntityClass(ClassNameDetails $entityClassDetails, bool $
]
);
- $entityAlias = strtolower($entityClassDetails->getShortName()[0]);
- $this->generator->generateClass(
+ $this->generateRepositoryClass(
$repoClassDetails->getFullName(),
+ $entityClassDetails->getFullName(),
+ $withPasswordUpgrade)
+ ;
+
+ return $entityPath;
+ }
+
+ public function generateRepositoryClass(string $repositoryClass, string $entityClass, bool $withPasswordUpgrade)
+ {
+ $shortEntityClass = Str::getShortClassName($entityClass);
+ $entityAlias = strtolower($shortEntityClass[0]);
+ $this->generator->generateClass(
+ $repositoryClass,
'doctrine/Repository.tpl.php',
[
- 'entity_full_class_name' => $entityClassDetails->getFullName(),
- 'entity_class_name' => $entityClassDetails->getShortName(),
+ 'entity_full_class_name' => $entityClass,
+ 'entity_class_name' => $shortEntityClass,
'entity_alias' => $entityAlias,
'with_password_upgrade' => $withPasswordUpgrade,
- 'doctrine_registry_class' => interface_exists(ManagerRegistry::class) ? ManagerRegistry::class : LegacyManagerRegistry::class,
+ 'doctrine_registry_class' => $this->managerRegistryClassName,
]
);
+ }
- return $entityPath;
+ /**
+ * Called by a compiler pass to inject the non-legacy value if available.
+ */
+ public function setMangerRegistryClassName(string $managerRegistryClassName)
+ {
+ $this->managerRegistryClassName = $managerRegistryClassName;
}
}
diff --git a/src/Doctrine/EntityRegenerator.php b/src/Doctrine/EntityRegenerator.php
index 0569ebf85..b91974b55 100644
--- a/src/Doctrine/EntityRegenerator.php
+++ b/src/Doctrine/EntityRegenerator.php
@@ -11,15 +11,12 @@
namespace Symfony\Bundle\MakerBundle\Doctrine;
-use Doctrine\Common\Persistence\ManagerRegistry as LegacyManagerRegistry;
use Doctrine\Common\Persistence\Mapping\MappingException as CommonMappingException;
use Doctrine\ORM\Mapping\ClassMetadata;
use Doctrine\ORM\Mapping\MappingException;
-use Doctrine\Persistence\ManagerRegistry;
use Symfony\Bundle\MakerBundle\Exception\RuntimeCommandException;
use Symfony\Bundle\MakerBundle\FileManager;
use Symfony\Bundle\MakerBundle\Generator;
-use Symfony\Bundle\MakerBundle\Str;
use Symfony\Bundle\MakerBundle\Util\ClassSourceManipulator;
/**
@@ -30,13 +27,15 @@ final class EntityRegenerator
private $doctrineHelper;
private $fileManager;
private $generator;
+ private $entityClassGenerator;
private $overwrite;
- public function __construct(DoctrineHelper $doctrineHelper, FileManager $fileManager, Generator $generator, bool $overwrite)
+ public function __construct(DoctrineHelper $doctrineHelper, FileManager $fileManager, Generator $generator, EntityClassGenerator $entityClassGenerator, bool $overwrite)
{
$this->doctrineHelper = $doctrineHelper;
$this->fileManager = $fileManager;
$this->generator = $generator;
+ $this->entityClassGenerator = $entityClassGenerator;
$this->overwrite = $overwrite;
}
@@ -226,19 +225,10 @@ private function generateRepository(ClassMetadata $metadata)
return;
}
- // duplication in MakeEntity
- $entityClassName = Str::getShortClassName($metadata->name);
-
- $this->generator->generateClass(
+ $this->entityClassGenerator->generateRepositoryClass(
$metadata->customRepositoryClassName,
- 'doctrine/Repository.tpl.php',
- [
- 'entity_full_class_name' => $metadata->name,
- 'entity_class_name' => $entityClassName,
- 'entity_alias' => strtolower($entityClassName[0]),
- 'with_password_upgrade' => false,
- 'doctrine_registry_class' => interface_exists(ManagerRegistry::class) ? ManagerRegistry::class : LegacyManagerRegistry::class,
- ]
+ $metadata->name,
+ false
);
$this->generator->writeChanges();
diff --git a/src/Maker/MakeEntity.php b/src/Maker/MakeEntity.php
index 21c1360c2..a3d7ab030 100644
--- a/src/Maker/MakeEntity.php
+++ b/src/Maker/MakeEntity.php
@@ -47,8 +47,9 @@ final class MakeEntity extends AbstractMaker implements InputAwareMakerInterface
private $fileManager;
private $doctrineHelper;
private $generator;
+ private $entityClassGenerator;
- public function __construct(FileManager $fileManager, DoctrineHelper $doctrineHelper, string $projectDirectory, Generator $generator = null)
+ public function __construct(FileManager $fileManager, DoctrineHelper $doctrineHelper, string $projectDirectory, Generator $generator = null, EntityClassGenerator $entityClassGenerator = null)
{
$this->fileManager = $fileManager;
$this->doctrineHelper = $doctrineHelper;
@@ -60,6 +61,13 @@ public function __construct(FileManager $fileManager, DoctrineHelper $doctrineHe
} else {
$this->generator = $generator;
}
+
+ if (null === $entityClassGenerator) {
+ @trigger_error(sprintf('Passing a "%s" instance as 5th argument is mandatory since version 1.15.1', Generator::class), E_USER_DEPRECATED);
+ $this->entityClassGenerator = new EntityClassGenerator($generator, $this->doctrineHelper);
+ } else {
+ $this->entityClassGenerator = $entityClassGenerator;
+ }
}
public static function getCommandName(): string
@@ -137,8 +145,7 @@ public function generate(InputInterface $input, ConsoleStyle $io, Generator $gen
$classExists = class_exists($entityClassDetails->getFullName());
if (!$classExists) {
- $entityClassGenerator = new EntityClassGenerator($generator, $this->doctrineHelper);
- $entityPath = $entityClassGenerator->generateEntityClass(
+ $entityPath = $this->entityClassGenerator->generateEntityClass(
$entityClassDetails,
$input->getOption('api-resource')
);
@@ -766,7 +773,7 @@ private function isClassInVendor(string $class): bool
private function regenerateEntities(string $classOrNamespace, bool $overwrite, Generator $generator)
{
- $regenerator = new EntityRegenerator($this->doctrineHelper, $this->fileManager, $generator, $overwrite);
+ $regenerator = new EntityRegenerator($this->doctrineHelper, $this->fileManager, $generator, $this->entityClassGenerator, $overwrite);
$regenerator->regenerateEntities($classOrNamespace);
}
diff --git a/src/Maker/MakeUser.php b/src/Maker/MakeUser.php
index 33e3d908c..58569cc52 100644
--- a/src/Maker/MakeUser.php
+++ b/src/Maker/MakeUser.php
@@ -51,13 +51,15 @@ final class MakeUser extends AbstractMaker
private $configUpdater;
private $doctrineHelper;
+ private $entityClassGenerator;
- public function __construct(FileManager $fileManager, UserClassBuilder $userClassBuilder, SecurityConfigUpdater $configUpdater, DoctrineHelper $doctrineHelper)
+ public function __construct(FileManager $fileManager, UserClassBuilder $userClassBuilder, SecurityConfigUpdater $configUpdater, DoctrineHelper $doctrineHelper, EntityClassGenerator $entityClassGenerator)
{
$this->fileManager = $fileManager;
$this->userClassBuilder = $userClassBuilder;
$this->configUpdater = $configUpdater;
$this->doctrineHelper = $doctrineHelper;
+ $this->entityClassGenerator = $entityClassGenerator;
}
public static function getCommandName(): string
@@ -139,8 +141,7 @@ public function generate(InputInterface $input, ConsoleStyle $io, Generator $gen
// A) Generate the User class
if ($userClassConfiguration->isEntity()) {
- $entityClassGenerator = new EntityClassGenerator($generator, $this->doctrineHelper);
- $classPath = $entityClassGenerator->generateEntityClass(
+ $classPath = $this->entityClassGenerator->generateEntityClass(
$userClassNameDetails,
false, // api resource
$userClassConfiguration->hasPassword() && interface_exists(PasswordUpgraderInterface::class) // security user
diff --git a/src/MakerBundle.php b/src/MakerBundle.php
index b09e8e4a1..a55160cde 100644
--- a/src/MakerBundle.php
+++ b/src/MakerBundle.php
@@ -13,6 +13,7 @@
use Symfony\Bundle\MakerBundle\DependencyInjection\CompilerPass\MakeCommandRegistrationPass;
use Symfony\Bundle\MakerBundle\DependencyInjection\CompilerPass\RemoveMissingParametersPass;
+use Symfony\Bundle\MakerBundle\DependencyInjection\CompilerPass\SetDoctrineManagerRegistryClassPass;
use Symfony\Component\DependencyInjection\Compiler\PassConfig;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\HttpKernel\Bundle\Bundle;
@@ -28,5 +29,6 @@ public function build(ContainerBuilder $container)
// add a priority so we run before the core command pass
$container->addCompilerPass(new MakeCommandRegistrationPass(), PassConfig::TYPE_BEFORE_OPTIMIZATION, 10);
$container->addCompilerPass(new RemoveMissingParametersPass());
+ $container->addCompilerPass(new SetDoctrineManagerRegistryClassPass());
}
}
diff --git a/src/Resources/config/makers.xml b/src/Resources/config/makers.xml
index 2af2ed531..a4d4244e7 100644
--- a/src/Resources/config/makers.xml
+++ b/src/Resources/config/makers.xml
@@ -35,6 +35,7 @@
%kernel.project_dir%
+
@@ -107,6 +108,7 @@
+
diff --git a/src/Resources/config/services.xml b/src/Resources/config/services.xml
index d11e32d0f..2a02a1f9f 100644
--- a/src/Resources/config/services.xml
+++ b/src/Resources/config/services.xml
@@ -48,6 +48,7 @@
+
diff --git a/tests/Doctrine/EntityRegeneratorTest.php b/tests/Doctrine/EntityRegeneratorTest.php
index 68f094a6a..71ac3d5e0 100644
--- a/tests/Doctrine/EntityRegeneratorTest.php
+++ b/tests/Doctrine/EntityRegeneratorTest.php
@@ -12,10 +12,12 @@
namespace Symfony\Bundle\MakerBundle\Tests\Doctrine;
use Doctrine\Bundle\DoctrineBundle\DoctrineBundle;
+use Doctrine\Persistence\ManagerRegistry;
use PHPUnit\Framework\TestCase;
use Symfony\Bundle\FrameworkBundle\FrameworkBundle;
use Symfony\Bundle\FrameworkBundle\Kernel\MicroKernelTrait;
use Symfony\Bundle\MakerBundle\Doctrine\DoctrineHelper;
+use Symfony\Bundle\MakerBundle\Doctrine\EntityClassGenerator;
use Symfony\Bundle\MakerBundle\Doctrine\EntityRegenerator;
use Symfony\Bundle\MakerBundle\FileManager;
use Symfony\Bundle\MakerBundle\Generator;
@@ -110,10 +112,14 @@ private function doTestRegeneration(string $sourceDir, Kernel $kernel, string $n
$fileManager = new FileManager($fs, $autoloaderUtil, $tmpDir);
$doctrineHelper = new DoctrineHelper('App\\Entity', $container->get('doctrine'));
+ $generator = new Generator($fileManager, 'App\\');
+ $entityClassGenerator = new EntityClassGenerator($generator, $doctrineHelper);
+ $entityClassGenerator->setMangerRegistryClassName(ManagerRegistry::class);
$regenerator = new EntityRegenerator(
$doctrineHelper,
$fileManager,
- new Generator($fileManager, 'App\\'),
+ $generator,
+ $entityClassGenerator,
$overwrite
);