Skip to content

Commit 6fa0738

Browse files
committed
Implement configuration + helper for custom namespaces
1 parent e88dde4 commit 6fa0738

26 files changed

+292
-44
lines changed

src/DependencyInjection/Configuration.php

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,20 @@ public function getConfigTreeBuilder(): TreeBuilder
2626

2727
$rootNode
2828
->children()
29-
->scalarNode('root_namespace')->defaultValue('App')->end()
29+
->scalarNode('root_namespace')->defaultValue('App\\')->end()
30+
->scalarNode('command_namespace')->defaultValue('Command\\')->end()
31+
->scalarNode('controller_namespace')->defaultValue('Controller\\')->end()
32+
->scalarNode('entity_namespace')->defaultValue('Entity\\')->end()
33+
->scalarNode('fixtures_namespace')->defaultValue('DataFixtures\\')->end()
34+
->scalarNode('form_namespace')->defaultValue('Form\\')->end()
35+
->scalarNode('functional_test_namespace')->defaultValue('Tests\\')->end()
36+
->scalarNode('repository_namespace')->defaultValue('Repository\\')->end()
37+
->scalarNode('security_namespace')->defaultValue('Security\\')->end()
38+
->scalarNode('serializer_namespace')->defaultValue('Serializer\\')->end()
39+
->scalarNode('subscriber_namespace')->defaultValue('EventSubscriber\\')->end()
40+
->scalarNode('twig_namespace')->defaultValue('Twig\\')->end()
41+
->scalarNode('unit_test_namespace')->defaultValue('Tests\\')->end()
42+
->scalarNode('validator_namespace')->defaultValue('Validator\\')->end()
3043
->end()
3144
;
3245

src/DependencyInjection/MakerExtension.php

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,24 @@
2626
*/
2727
class MakerExtension extends Extension
2828
{
29+
/** @var string[] */
30+
private static $namespaces = [
31+
'root_namespace',
32+
'command_namespace',
33+
'controller_namespace',
34+
'entity_namespace',
35+
'fixtures_namespace',
36+
'form_namespace',
37+
'functional_test_namespace',
38+
'repository_namespace',
39+
'security_namespace',
40+
'serializer_namespace',
41+
'subscriber_namespace',
42+
'twig_namespace',
43+
'unit_test_namespace',
44+
'validator_namespace'
45+
];
46+
2947
/**
3048
* @deprecated remove this block when removing make:unit-test and make:functional-test
3149
*/
@@ -54,7 +72,10 @@ public function load(array $configs, ContainerBuilder $container): void
5472
$configuration = $this->getConfiguration($configs, $container);
5573
$config = $this->processConfiguration($configuration, $configs);
5674

57-
$rootNamespace = trim($config['root_namespace'], '\\');
75+
$namespacesHelperDefinition = $container->getDefinition('maker.namespaces_helper');
76+
foreach (static::$namespaces as $index => $namespace) {
77+
$namespacesHelperDefinition->replaceArgument($index, \trim($config[$namespace], '\\'));
78+
}
5879

5980
$autoloaderFinderDefinition = $container->getDefinition('maker.autoloader_finder');
6081
$autoloaderFinderDefinition->replaceArgument(0, $rootNamespace);

src/Doctrine/DoctrineHelper.php

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
use Doctrine\Persistence\Mapping\Driver\MappingDriverChain;
2626
use Doctrine\Persistence\Mapping\MappingException as PersistenceMappingException;
2727
use Symfony\Bundle\MakerBundle\Util\ClassNameDetails;
28+
use Symfony\Bundle\MakerBundle\Util\NamespacesHelper;
2829
use Symfony\Component\Uid\Ulid;
2930
use Symfony\Component\Uid\Uuid;
3031

@@ -38,11 +39,10 @@
3839
final class DoctrineHelper
3940
{
4041
public function __construct(
41-
private string $entityNamespace,
42+
private NamespacesHelper $namespacesHelper,
4243
private ?ManagerRegistry $registry = null,
4344
private ?array $mappingDriversByPrefix = null,
4445
) {
45-
$this->entityNamespace = trim($entityNamespace, '\\');
4646
}
4747

4848
public function getRegistry(): ManagerRegistry
@@ -63,7 +63,11 @@ private function isDoctrineInstalled(): bool
6363

6464
public function getEntityNamespace(): string
6565
{
66-
return $this->entityNamespace;
66+
return \sprintf(
67+
'%s\\%s',
68+
$this->namespacesHelper->getRootNamespace(),
69+
$this->namespacesHelper->getEntityNamespace()
70+
);
6771
}
6872

6973
public function doesClassUseDriver(string $className, string $driverClass): bool
@@ -137,7 +141,7 @@ public function getEntitiesForAutocomplete(): array
137141
$allMetadata = $this->getMetadata();
138142

139143
foreach (array_keys($allMetadata) as $classname) {
140-
$entityClassDetails = new ClassNameDetails($classname, $this->entityNamespace);
144+
$entityClassDetails = new ClassNameDetails($classname, $this->getEntityNamespace());
141145
$entities[] = $entityClassDetails->getRelativeName();
142146
}
143147
}

src/Doctrine/EntityClassGenerator.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public function generateEntityClass(ClassNameDetails $entityClassDetails, bool $
3939
{
4040
$repoClassDetails = $this->generator->createClassNameDetails(
4141
$entityClassDetails->getRelativeName(),
42-
'Repository\\',
42+
$this->generator->getNamespacesHelper()->getRepositoryNamespace(),
4343
'Repository'
4444
);
4545

src/Generator.php

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
1515
use Symfony\Bundle\MakerBundle\Exception\RuntimeCommandException;
1616
use Symfony\Bundle\MakerBundle\Util\ClassNameDetails;
17+
use Symfony\Bundle\MakerBundle\Util\NamespacesHelper;
1718
use Symfony\Bundle\MakerBundle\Util\PhpCompatUtil;
1819
use Symfony\Bundle\MakerBundle\Util\TemplateComponentGenerator;
1920

@@ -26,15 +27,16 @@ class Generator
2627
private GeneratorTwigHelper $twigHelper;
2728
private array $pendingOperations = [];
2829
private ?TemplateComponentGenerator $templateComponentGenerator;
30+
private NamespacesHelper $namespacesHelper;
2931

3032
public function __construct(
3133
private FileManager $fileManager,
32-
private string $namespacePrefix,
34+
NamespacesHelper $namespacesHelper,
3335
PhpCompatUtil $phpCompatUtil = null,
3436
TemplateComponentGenerator $templateComponentGenerator = null,
3537
) {
3638
$this->twigHelper = new GeneratorTwigHelper($fileManager);
37-
$this->namespacePrefix = trim($namespacePrefix, '\\');
39+
$this->namespacesHelper = $namespacesHelper;
3840

3941
if (null !== $phpCompatUtil) {
4042
trigger_deprecation('symfony/maker-bundle', 'v1.44.0', 'Initializing Generator while providing an instance of PhpCompatUtil is deprecated.');
@@ -136,7 +138,7 @@ public function getFileContentsForPendingOperation(string $targetPath): string
136138
*/
137139
public function createClassNameDetails(string $name, string $namespacePrefix, string $suffix = '', string $validationErrorMessage = ''): ClassNameDetails
138140
{
139-
$fullNamespacePrefix = $this->namespacePrefix.'\\'.$namespacePrefix;
141+
$fullNamespacePrefix = $this->namespacesHelper->getRootNamespace().'\\'.$namespacePrefix;
140142
if ('\\' === $name[0]) {
141143
// class is already "absolute" - leave it alone (but strip opening \)
142144
$className = substr($name, 1);
@@ -211,9 +213,14 @@ public function writeChanges()
211213
$this->pendingOperations = [];
212214
}
213215

216+
public function getNamespacesHelper(): NamespacesHelper
217+
{
218+
return $this->namespacesHelper;
219+
}
220+
214221
public function getRootNamespace(): string
215222
{
216-
return $this->namespacePrefix;
223+
return $this->namespacesHelper->getRootNamespace();
217224
}
218225

219226
public function generateController(string $controllerClassName, string $controllerTemplatePath, array $parameters = []): string

src/Maker/MakeCommand.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ public function generate(InputInterface $input, ConsoleStyle $io, Generator $gen
6262

6363
$commandClassNameDetails = $generator->createClassNameDetails(
6464
$commandNameHasAppPrefix ? substr($commandName, 4) : $commandName,
65-
'Command\\',
65+
$generator->getNamespacesHelper()->getCommandNamespace(),
6666
'Command',
6767
sprintf('The "%s" command name is not valid because it would be implemented by "%s" class, which is not valid as a PHP class name (it must start with a letter or underscore, followed by any number of letters, numbers, or underscores).', $commandName, Str::asClassName($commandName, 'Command'))
6868
);

src/Maker/MakeController.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ public function generate(InputInterface $input, ConsoleStyle $io, Generator $gen
7070
{
7171
$controllerClassNameDetails = $generator->createClassNameDetails(
7272
$input->getArgument('controller-class'),
73-
'Controller\\',
73+
$generator->getNamespacesHelper()->getControllerNamespace(),
7474
'Controller'
7575
);
7676

src/Maker/MakeCrud.php

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -102,9 +102,11 @@ public function interact(InputInterface $input, ConsoleStyle $io, Command $comma
102102

103103
public function generate(InputInterface $input, ConsoleStyle $io, Generator $generator): void
104104
{
105+
$namespacesHelper = $generator->getNamespacesHelper();
106+
105107
$entityClassDetails = $generator->createClassNameDetails(
106108
Validator::entityExists($input->getArgument('entity-class'), $this->doctrineHelper->getEntitiesForAutocomplete()),
107-
'Entity\\'
109+
$namespacesHelper->getEntityNamespace()
108110
);
109111

110112
$entityDoctrineDetails = $this->doctrineHelper->createDoctrineDetails($entityClassDetails->getFullName());
@@ -115,7 +117,7 @@ public function generate(InputInterface $input, ConsoleStyle $io, Generator $gen
115117
if (null !== $entityDoctrineDetails->getRepositoryClass()) {
116118
$repositoryClassDetails = $generator->createClassNameDetails(
117119
'\\'.$entityDoctrineDetails->getRepositoryClass(),
118-
'Repository\\',
120+
$namespacesHelper->getRepositoryNamespace(),
119121
'Repository'
120122
);
121123

@@ -130,15 +132,15 @@ public function generate(InputInterface $input, ConsoleStyle $io, Generator $gen
130132

131133
$controllerClassDetails = $generator->createClassNameDetails(
132134
$this->controllerClassName,
133-
'Controller\\',
135+
$namespacesHelper->getControllerNamespace(),
134136
'Controller'
135137
);
136138

137139
$iter = 0;
138140
do {
139141
$formClassDetails = $generator->createClassNameDetails(
140142
$entityClassDetails->getRelativeNameWithoutSuffix().($iter ?: '').'Type',
141-
'Form\\',
143+
$namespacesHelper->getFormNamespace(),
142144
'Type'
143145
);
144146
++$iter;

src/Maker/MakeEntity.php

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
use Symfony\Bundle\MakerBundle\Util\ClassDetails;
3030
use Symfony\Bundle\MakerBundle\Util\ClassSourceManipulator;
3131
use Symfony\Bundle\MakerBundle\Util\PhpCompatUtil;
32+
use Symfony\Bundle\MakerBundle\Util\NamespacesHelper;
3233
use Symfony\Bundle\MakerBundle\Validator;
3334
use Symfony\Component\Console\Command\Command;
3435
use Symfony\Component\Console\Input\InputArgument;
@@ -63,7 +64,7 @@ public function __construct(
6364

6465
if (null === $generator) {
6566
@trigger_error(sprintf('Passing a "%s" instance as 4th argument is mandatory since version 1.5.', Generator::class), \E_USER_DEPRECATED);
66-
$this->generator = new Generator($fileManager, 'App\\');
67+
$this->generator = new Generator($fileManager, new NamespacesHelper('App\\'));
6768
} else {
6869
$this->generator = $generator;
6970
}
@@ -131,10 +132,12 @@ public function interact(InputInterface $input, ConsoleStyle $io, Command $comma
131132

132133
$input->setArgument('name', $entityClassName);
133134

135+
$entityNamespace = $this->doctrineHelper->getEntityNamespace();
136+
134137
if (
135138
!$input->getOption('api-resource') &&
136139
class_exists(ApiResource::class) &&
137-
!class_exists($this->generator->createClassNameDetails($entityClassName, 'Entity\\')->getFullName())
140+
!class_exists($this->generator->createClassNameDetails($entityClassName, $entityNamespace)->getFullName())
138141
) {
139142
$description = $command->getDefinition()->getOption('api-resource')->getDescription();
140143
$question = new ConfirmationQuestion($description, false);
@@ -170,7 +173,7 @@ public function generate(InputInterface $input, ConsoleStyle $io, Generator $gen
170173

171174
$entityClassDetails = $generator->createClassNameDetails(
172175
$input->getArgument('name'),
173-
'Entity\\'
176+
$generator->getNamespacesHelper()->getEntityNamespace()
174177
);
175178

176179
$classExists = class_exists($entityClassDetails->getFullName());

src/Maker/MakeFixtures.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public function generate(InputInterface $input, ConsoleStyle $io, Generator $gen
5151
{
5252
$fixturesClassNameDetails = $generator->createClassNameDetails(
5353
$input->getArgument('fixtures-class'),
54-
'DataFixtures\\'
54+
$generator->getNamespacesHelper()->getFixturesNamespace()
5555
);
5656

5757
$generator->generateClass(

0 commit comments

Comments
 (0)