Skip to content

Commit e0c5f2b

Browse files
jrushlowweaverryan
authored andcommitted
[make:user] Legacy <= 5.3 & Doctrine Cleanup
1 parent 9a61b81 commit e0c5f2b

27 files changed

+159
-929
lines changed

composer.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
"require-dev": {
2929
"composer/semver": "^3.0",
3030
"doctrine/doctrine-bundle": "^2.4",
31-
"doctrine/orm": "^2.3",
31+
"doctrine/orm": "^2.10.0",
3232
"symfony/http-client": "^5.4.7|^6.0",
3333
"symfony/phpunit-bridge": "^5.4.7|^6.0",
3434
"symfony/polyfill-php80": "^1.16.0",
@@ -41,6 +41,9 @@
4141
"preferred-install": "dist",
4242
"sort-packages": true
4343
},
44+
"conflict": {
45+
"doctrine/orm": "<2.10"
46+
},
4447
"autoload": {
4548
"psr-4": { "Symfony\\Bundle\\MakerBundle\\": "src/" }
4649
},

src/DependencyInjection/CompilerPass/SetDoctrineManagerRegistryClassPass.php

Lines changed: 0 additions & 30 deletions
This file was deleted.

src/Doctrine/EntityClassGenerator.php

Lines changed: 43 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,21 @@
1111

1212
namespace Symfony\Bundle\MakerBundle\Doctrine;
1313

14-
use Doctrine\Common\Persistence\ManagerRegistry as LegacyManagerRegistry;
14+
use ApiPlatform\Metadata\ApiResource;
15+
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
16+
use Doctrine\ORM\Exception\ORMException;
17+
use Doctrine\ORM\Mapping;
18+
use Doctrine\ORM\OptimisticLockException;
19+
use Doctrine\Persistence\ManagerRegistry;
1520
use Symfony\Bundle\MakerBundle\Generator;
1621
use Symfony\Bundle\MakerBundle\Str;
1722
use Symfony\Bundle\MakerBundle\Util\ClassNameDetails;
23+
use Symfony\Bundle\MakerBundle\Util\UseStatementGenerator;
24+
use Symfony\Component\Security\Core\Exception\UnsupportedUserException;
1825
use Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface;
26+
use Symfony\Component\Security\Core\User\PasswordUpgraderInterface;
1927
use Symfony\Component\Security\Core\User\UserInterface;
28+
use Symfony\UX\Turbo\Attribute\Broadcast;
2029

2130
/**
2231
* @internal
@@ -25,7 +34,6 @@ final class EntityClassGenerator
2534
{
2635
private $generator;
2736
private $doctrineHelper;
28-
private $managerRegistryClassName = LegacyManagerRegistry::class;
2937

3038
public function __construct(Generator $generator, DoctrineHelper $doctrineHelper)
3139
{
@@ -43,11 +51,25 @@ public function generateEntityClass(ClassNameDetails $entityClassDetails, bool $
4351

4452
$tableName = $this->doctrineHelper->getPotentialTableName($entityClassDetails->getFullName());
4553

54+
$useStatements = new UseStatementGenerator([
55+
$repoClassDetails->getFullName(),
56+
[Mapping::class => 'ORM'],
57+
]);
58+
59+
if ($broadcast) {
60+
$useStatements->addUseStatement(Broadcast::class);
61+
}
62+
63+
if ($apiResource) {
64+
// @legacy Drop annotation class when annotations are no longer supported.
65+
$useStatements->addUseStatement(class_exists(ApiResource::class) ? ApiResource::class : \ApiPlatform\Core\Annotation\ApiResource::class);
66+
}
67+
4668
$entityPath = $this->generator->generateClass(
4769
$entityClassDetails->getFullName(),
4870
'doctrine/Entity.tpl.php',
4971
[
50-
'repository_full_class_name' => $repoClassDetails->getFullName(),
72+
'use_statements' => $useStatements,
5173
'repository_class_name' => $repoClassDetails->getShortName(),
5274
'api_resource' => $apiResource,
5375
'broadcast' => $broadcast,
@@ -69,7 +91,7 @@ public function generateEntityClass(ClassNameDetails $entityClassDetails, bool $
6991
return $entityPath;
7092
}
7193

72-
public function generateRepositoryClass(string $repositoryClass, string $entityClass, bool $withPasswordUpgrade, bool $includeExampleComments = true)
94+
public function generateRepositoryClass(string $repositoryClass, string $entityClass, bool $withPasswordUpgrade, bool $includeExampleComments = true): void
7395
{
7496
$shortEntityClass = Str::getShortClassName($entityClass);
7597
$entityAlias = strtolower($shortEntityClass[0]);
@@ -82,26 +104,33 @@ public function generateRepositoryClass(string $repositoryClass, string $entityC
82104

83105
$interfaceClassNameDetails = new ClassNameDetails($passwordUserInterfaceName, 'Symfony\Component\Security\Core\User');
84106

107+
$useStatements = new UseStatementGenerator([
108+
$entityClass,
109+
ManagerRegistry::class,
110+
ServiceEntityRepository::class,
111+
OptimisticLockException::class,
112+
ORMException::class,
113+
]);
114+
115+
if ($withPasswordUpgrade) {
116+
$useStatements->addUseStatement([
117+
$interfaceClassNameDetails->getFullName(),
118+
PasswordUpgraderInterface::class,
119+
UnsupportedUserException::class,
120+
]);
121+
}
122+
85123
$this->generator->generateClass(
86124
$repositoryClass,
87125
'doctrine/Repository.tpl.php',
88126
[
89-
'entity_full_class_name' => $entityClass,
127+
'use_statements' => $useStatements,
90128
'entity_class_name' => $shortEntityClass,
91129
'entity_alias' => $entityAlias,
92130
'with_password_upgrade' => $withPasswordUpgrade,
93131
'password_upgrade_user_interface' => $interfaceClassNameDetails,
94-
'doctrine_registry_class' => $this->managerRegistryClassName,
95132
'include_example_comments' => $includeExampleComments,
96133
]
97134
);
98135
}
99-
100-
/**
101-
* Called by a compiler pass to inject the non-legacy value if available.
102-
*/
103-
public function setMangerRegistryClassName(string $managerRegistryClassName)
104-
{
105-
$this->managerRegistryClassName = $managerRegistryClassName;
106-
}
107136
}

src/Maker/MakeEntity.php

Lines changed: 33 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
use Symfony\Bundle\MakerBundle\Str;
2929
use Symfony\Bundle\MakerBundle\Util\ClassDetails;
3030
use Symfony\Bundle\MakerBundle\Util\ClassSourceManipulator;
31+
use Symfony\Bundle\MakerBundle\Util\PhpCompatUtil;
3132
use Symfony\Bundle\MakerBundle\Validator;
3233
use Symfony\Component\Console\Command\Command;
3334
use Symfony\Component\Console\Input\InputArgument;
@@ -48,12 +49,22 @@ final class MakeEntity extends AbstractMaker implements InputAwareMakerInterface
4849
private $doctrineHelper;
4950
private $generator;
5051
private $entityClassGenerator;
51-
52-
public function __construct(FileManager $fileManager, DoctrineHelper $doctrineHelper, string $projectDirectory, Generator $generator = null, EntityClassGenerator $entityClassGenerator = null)
53-
{
52+
private $phpCompatUtil;
53+
54+
public function __construct(
55+
FileManager $fileManager,
56+
DoctrineHelper $doctrineHelper,
57+
string $projectDirectory = null,
58+
Generator $generator = null,
59+
EntityClassGenerator $entityClassGenerator = null,
60+
PhpCompatUtil $phpCompatUtil = null
61+
) {
5462
$this->fileManager = $fileManager;
5563
$this->doctrineHelper = $doctrineHelper;
56-
// $projectDirectory is unused, argument kept for BC
64+
65+
if (null !== $projectDirectory) {
66+
@trigger_error('The $projectDirectory constructor argument is no longer used since 1.41.0', \E_USER_DEPRECATED);
67+
}
5768

5869
if (null === $generator) {
5970
@trigger_error(sprintf('Passing a "%s" instance as 4th argument is mandatory since version 1.5.', Generator::class), \E_USER_DEPRECATED);
@@ -68,6 +79,13 @@ public function __construct(FileManager $fileManager, DoctrineHelper $doctrineHe
6879
} else {
6980
$this->entityClassGenerator = $entityClassGenerator;
7081
}
82+
83+
if (null === $phpCompatUtil) {
84+
@trigger_error(sprintf('Passing a "%s" instance as 6th argument is mandatory since version 1.41.0', PhpCompatUtil::class), \E_USER_DEPRECATED);
85+
$this->phpCompatUtil = new PhpCompatUtil($this->fileManager);
86+
} else {
87+
$this->phpCompatUtil = $phpCompatUtil;
88+
}
7189
}
7290

7391
public static function getCommandName(): string
@@ -80,7 +98,7 @@ public static function getCommandDescription(): string
8098
return 'Creates or updates a Doctrine entity class, and optionally an API Platform resource';
8199
}
82100

83-
public function configureCommand(Command $command, InputConfiguration $inputConf)
101+
public function configureCommand(Command $command, InputConfiguration $inputConfig): void
84102
{
85103
$command
86104
->addArgument('name', InputArgument::OPTIONAL, sprintf('Class name of the entity to create or update (e.g. <fg=yellow>%s</>)', Str::asClassName(Str::getRandomTerm())))
@@ -91,10 +109,10 @@ public function configureCommand(Command $command, InputConfiguration $inputConf
91109
->setHelp(file_get_contents(__DIR__.'/../Resources/help/MakeEntity.txt'))
92110
;
93111

94-
$inputConf->setArgumentAsNonInteractive('name');
112+
$inputConfig->setArgumentAsNonInteractive('name');
95113
}
96114

97-
public function interact(InputInterface $input, ConsoleStyle $io, Command $command)
115+
public function interact(InputInterface $input, ConsoleStyle $io, Command $command): void
98116
{
99117
if ($input->getArgument('name')) {
100118
return;
@@ -143,7 +161,7 @@ class_exists(Broadcast::class) &&
143161
}
144162
}
145163

146-
public function generate(InputInterface $input, ConsoleStyle $io, Generator $generator)
164+
public function generate(InputInterface $input, ConsoleStyle $io, Generator $generator): void
147165
{
148166
$overwrite = $input->getOption('overwrite');
149167

@@ -308,7 +326,7 @@ public function generate(InputInterface $input, ConsoleStyle $io, Generator $gen
308326
]);
309327
}
310328

311-
public function configureDependencies(DependencyBuilder $dependencies, InputInterface $input = null)
329+
public function configureDependencies(DependencyBuilder $dependencies, InputInterface $input = null): void
312330
{
313331
if (null !== $input && $input->getOption('api-resource')) {
314332
$dependencies->addClassDependency(
@@ -424,7 +442,7 @@ private function askForNextField(ConsoleStyle $io, array $fields, string $entity
424442
return $data;
425443
}
426444

427-
private function printAvailableTypes(ConsoleStyle $io)
445+
private function printAvailableTypes(ConsoleStyle $io): void
428446
{
429447
$allTypes = $this->getTypesMap();
430448

@@ -810,9 +828,7 @@ private function createClassManipulator(string $path, ConsoleStyle $io, bool $ov
810828

811829
private function getPathOfClass(string $class): string
812830
{
813-
$classDetails = new ClassDetails($class);
814-
815-
return $classDetails->getPath();
831+
return (new ClassDetails($class))->getPath();
816832
}
817833

818834
private function isClassInVendor(string $class): bool
@@ -822,7 +838,7 @@ private function isClassInVendor(string $class): bool
822838
return $this->fileManager->isPathInVendor($path);
823839
}
824840

825-
private function regenerateEntities(string $classOrNamespace, bool $overwrite, Generator $generator)
841+
private function regenerateEntities(string $classOrNamespace, bool $overwrite, Generator $generator): void
826842
{
827843
$regenerator = new EntityRegenerator($this->doctrineHelper, $this->fileManager, $generator, $this->entityClassGenerator, $overwrite);
828844
$regenerator->regenerateEntities($classOrNamespace);
@@ -841,6 +857,7 @@ private function getPropertyNames(string $class): array
841857
}, $reflClass->getProperties());
842858
}
843859

860+
/** @legacy Drop when Annotations are no longer supported */
844861
private function doesEntityUseAnnotationMapping(string $className): bool
845862
{
846863
if (!class_exists($className)) {
@@ -857,9 +874,10 @@ private function doesEntityUseAnnotationMapping(string $className): bool
857874
return $this->doctrineHelper->isClassAnnotated($className);
858875
}
859876

877+
/** @legacy Drop when Annotations are no longer supported */
860878
private function doesEntityUseAttributeMapping(string $className): bool
861879
{
862-
if (\PHP_MAJOR_VERSION < 8) {
880+
if (!$this->phpCompatUtil->canUseAttributes()) {
863881
return false;
864882
}
865883

src/Maker/MakeUser.php

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,16 +25,20 @@
2525
use Symfony\Bundle\MakerBundle\Security\UserClassBuilder;
2626
use Symfony\Bundle\MakerBundle\Security\UserClassConfiguration;
2727
use Symfony\Bundle\MakerBundle\Util\ClassSourceManipulator;
28+
use Symfony\Bundle\MakerBundle\Util\UseStatementGenerator;
2829
use Symfony\Bundle\MakerBundle\Util\YamlManipulationFailedException;
2930
use Symfony\Bundle\MakerBundle\Validator;
3031
use Symfony\Bundle\SecurityBundle\SecurityBundle;
3132
use Symfony\Component\Console\Command\Command;
3233
use Symfony\Component\Console\Input\InputArgument;
3334
use Symfony\Component\Console\Input\InputInterface;
3435
use Symfony\Component\Console\Input\InputOption;
36+
use Symfony\Component\Security\Core\Exception\UnsupportedUserException;
3537
use Symfony\Component\Security\Core\Exception\UserNotFoundException;
3638
use Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface;
3739
use Symfony\Component\Security\Core\User\PasswordUpgraderInterface;
40+
use Symfony\Component\Security\Core\User\UserInterface;
41+
use Symfony\Component\Security\Core\User\UserProviderInterface;
3842
use Symfony\Component\Yaml\Yaml;
3943

4044
/**
@@ -45,13 +49,9 @@
4549
final class MakeUser extends AbstractMaker
4650
{
4751
private $fileManager;
48-
4952
private $userClassBuilder;
50-
5153
private $configUpdater;
52-
5354
private $entityClassGenerator;
54-
5555
private $doctrineHelper;
5656

5757
public function __construct(FileManager $fileManager, UserClassBuilder $userClassBuilder, SecurityConfigUpdater $configUpdater, EntityClassGenerator $entityClassGenerator, DoctrineHelper $doctrineHelper)
@@ -141,7 +141,7 @@ public function generate(InputInterface $input, ConsoleStyle $io, Generator $gen
141141
$classPath = $this->entityClassGenerator->generateEntityClass(
142142
$userClassNameDetails,
143143
false, // api resource
144-
$userClassConfiguration->hasPassword() && interface_exists(PasswordUpgraderInterface::class) // security user
144+
$userClassConfiguration->hasPassword() // security user
145145
);
146146
} else {
147147
$classPath = $generator->generateClass($userClassNameDetails->getFullName(), 'Class.tpl.php');
@@ -169,13 +169,22 @@ public function generate(InputInterface $input, ConsoleStyle $io, Generator $gen
169169
// C) Generate a custom user provider, if necessary
170170
if (!$userClassConfiguration->isEntity()) {
171171
$userClassConfiguration->setUserProviderClass($generator->getRootNamespace().'\\Security\\UserProvider');
172+
173+
$useStatements = new UseStatementGenerator([
174+
UnsupportedUserException::class,
175+
UserNotFoundException::class,
176+
PasswordAuthenticatedUserInterface::class,
177+
PasswordUpgraderInterface::class,
178+
UserInterface::class,
179+
UserProviderInterface::class,
180+
]);
181+
172182
$customProviderPath = $generator->generateClass(
173183
$userClassConfiguration->getUserProviderClass(),
174184
'security/UserProvider.tpl.php',
175185
[
176-
'uses_user_identifier' => class_exists(UserNotFoundException::class),
186+
'use_statements' => $useStatements,
177187
'user_short_name' => $userClassNameDetails->getShortName(),
178-
'use_legacy_password_upgrader_type' => !interface_exists(PasswordAuthenticatedUserInterface::class),
179188
]
180189
);
181190
}

src/MakerBundle.php

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
use Symfony\Bundle\MakerBundle\DependencyInjection\CompilerPass\MakeCommandRegistrationPass;
1616
use Symfony\Bundle\MakerBundle\DependencyInjection\CompilerPass\RemoveMissingParametersPass;
1717
use Symfony\Bundle\MakerBundle\DependencyInjection\CompilerPass\SetDoctrineAnnotatedPrefixesPass;
18-
use Symfony\Bundle\MakerBundle\DependencyInjection\CompilerPass\SetDoctrineManagerRegistryClassPass;
1918
use Symfony\Component\DependencyInjection\Compiler\PassConfig;
2019
use Symfony\Component\DependencyInjection\ContainerBuilder;
2120
use Symfony\Component\HttpKernel\Bundle\Bundle;
@@ -32,7 +31,6 @@ public function build(ContainerBuilder $container)
3231
$container->addCompilerPass(new DoctrineAttributesCheckPass(), PassConfig::TYPE_BEFORE_OPTIMIZATION, 11);
3332
$container->addCompilerPass(new MakeCommandRegistrationPass(), PassConfig::TYPE_BEFORE_OPTIMIZATION, 10);
3433
$container->addCompilerPass(new RemoveMissingParametersPass());
35-
$container->addCompilerPass(new SetDoctrineManagerRegistryClassPass());
3634
$container->addCompilerPass(new SetDoctrineAnnotatedPrefixesPass());
3735
}
3836
}

src/Resources/config/makers.xml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,10 @@
3939
<service id="maker.maker.make_entity" class="Symfony\Bundle\MakerBundle\Maker\MakeEntity">
4040
<argument type="service" id="maker.file_manager" />
4141
<argument type="service" id="maker.doctrine_helper" />
42-
<argument>%kernel.project_dir%</argument>
42+
<argument>null</argument>
4343
<argument type="service" id="maker.generator" />
4444
<argument type="service" id="maker.entity_class_generator" />
45+
<argument type="service" id="maker.php_compat_util" />
4546
<tag name="maker.command" />
4647
</service>
4748

0 commit comments

Comments
 (0)