Skip to content

Commit a4d76ad

Browse files
committed
Implement NamespacesHelper on fresh codebase
1 parent 2b80d6b commit a4d76ad

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+406
-116
lines changed

config/makers.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727

2828
<service id="maker.maker.make_controller" class="Symfony\Bundle\MakerBundle\Maker\MakeController">
2929
<tag name="maker.command" />
30+
<argument type="service" id="maker.namespaces_helper" />
3031
</service>
3132

3233
<service id="maker.maker.make_crud" class="Symfony\Bundle\MakerBundle\Maker\MakeCrud">
@@ -90,6 +91,7 @@
9091
<argument type="service" id="maker.file_manager" />
9192
<argument type="service" id="maker.doctrine_helper" />
9293
<argument type="service" id="maker.entity_class_generator" />
94+
<argument type="service" id="maker.namespaces_helper" />
9395
<argument type="service" id="router" on-invalid="ignore" />
9496
<tag name="maker.command" />
9597
</service>
@@ -118,6 +120,7 @@
118120
</service>
119121

120122
<service id="maker.maker.make_test" class="Symfony\Bundle\MakerBundle\Maker\MakeTest">
123+
<argument type="service" id="maker.namespaces_helper" />
121124
<tag name="maker.command" />
122125
</service>
123126

config/services.xml

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
</service>
1717

1818
<service id="maker.autoloader_finder" class="Symfony\Bundle\MakerBundle\Util\ComposerAutoloaderFinder" >
19-
<argument /> <!-- root namespace -->
19+
<argument type="service" id="maker.namespaces_helper" />
2020
</service>
2121

2222
<service id="maker.autoloader_util" class="Symfony\Bundle\MakerBundle\Util\AutoloaderUtil">
@@ -36,10 +36,14 @@
3636
</service>
3737

3838
<service id="maker.doctrine_helper" class="Symfony\Bundle\MakerBundle\Doctrine\DoctrineHelper">
39-
<argument /> <!-- entity namespace -->
39+
<argument type="service" id="maker.namespaces_helper" />
4040
<argument type="service" id="doctrine" on-invalid="ignore" />
4141
</service>
4242

43+
<service id="maker.namespaces_helper" class="Symfony\Bundle\MakerBundle\Util\NamespacesHelper">
44+
<argument type="collection" /> <!-- namespaces -->
45+
</service>
46+
4347
<service id="maker.template_linter" class="Symfony\Bundle\MakerBundle\Util\TemplateLinter">
4448
<argument>%env(default::string:MAKER_PHP_CS_FIXER_BINARY_PATH)%</argument>
4549
<argument>%env(default::string:MAKER_PHP_CS_FIXER_CONFIG_PATH)%</argument>
@@ -54,7 +58,7 @@
5458

5559
<service id="maker.generator" class="Symfony\Bundle\MakerBundle\Generator">
5660
<argument type="service" id="maker.file_manager" />
57-
<argument /> <!-- root namespace -->
61+
<argument type="service" id="maker.namespaces_helper" />
5862
<argument>null</argument> <!-- PhpCompatUtil -->
5963
<argument type="service" id="maker.template_component_generator" />
6064
</service>
@@ -82,7 +86,7 @@
8286
<service id="maker.template_component_generator" class="Symfony\Bundle\MakerBundle\Util\TemplateComponentGenerator">
8387
<argument /> <!-- generate_final_classes -->
8488
<argument /> <!-- generate_final_entities -->
85-
<argument /> <!-- root_namespace -->
89+
<argument type="service" id="maker.namespaces_helper" />
8690
</service>
8791
</services>
8892
</container>

src/Doctrine/DoctrineHelper.php

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
use Doctrine\Persistence\Mapping\MappingException as PersistenceMappingException;
2727
use Doctrine\Persistence\Mapping\StaticReflectionService;
2828
use Symfony\Bundle\MakerBundle\Util\ClassNameDetails;
29+
use Symfony\Bundle\MakerBundle\Util\NamespacesHelper;
2930
use Symfony\Component\Uid\Ulid;
3031
use Symfony\Component\Uid\Uuid;
3132

@@ -39,11 +40,10 @@
3940
final class DoctrineHelper
4041
{
4142
public function __construct(
42-
private string $entityNamespace,
43+
private NamespacesHelper $namespacesHelper,
4344
private ?ManagerRegistry $registry = null,
4445
private ?array $mappingDriversByPrefix = null,
4546
) {
46-
$this->entityNamespace = trim($entityNamespace, '\\');
4747
}
4848

4949
public function getRegistry(): ManagerRegistry
@@ -64,7 +64,11 @@ private function isDoctrineInstalled(): bool
6464

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

7074
public function doesClassUseDriver(string $className, string $driverClass): bool
@@ -138,7 +142,7 @@ public function getEntitiesForAutocomplete(): array
138142
$allMetadata = $this->getMetadata();
139143

140144
foreach (array_keys($allMetadata) as $classname) {
141-
$entityClassDetails = new ClassNameDetails($classname, $this->entityNamespace);
145+
$entityClassDetails = new ClassNameDetails($classname, $this->getEntityNamespace());
142146
$entities[] = $entityClassDetails->getRelativeName();
143147
}
144148
}

src/Doctrine/EntityClassGenerator.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ public function generateEntityClass(ClassNameDetails $entityClassDetails, bool $
4444
{
4545
$repoClassDetails = $this->generator->createClassNameDetails(
4646
$entityClassDetails->getRelativeName(),
47-
'Repository\\',
47+
$this->generator->getNamespacesHelper()->getRepositoryNamespace(),
4848
'Repository'
4949
);
5050

src/Generator.php

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
use Symfony\Bundle\MakerBundle\Exception\RuntimeCommandException;
1616
use Symfony\Bundle\MakerBundle\Util\ClassNameDetails;
1717
use Symfony\Bundle\MakerBundle\Util\ClassSource\Model\ClassData;
18+
use Symfony\Bundle\MakerBundle\Util\NamespacesHelper;
1819
use Symfony\Bundle\MakerBundle\Util\PhpCompatUtil;
1920
use Symfony\Bundle\MakerBundle\Util\TemplateComponentGenerator;
2021

@@ -30,12 +31,11 @@ class Generator
3031

3132
public function __construct(
3233
private FileManager $fileManager,
33-
private string $namespacePrefix,
34+
private NamespacesHelper $namespacesHelper,
3435
?PhpCompatUtil $phpCompatUtil = null,
3536
private ?TemplateComponentGenerator $templateComponentGenerator = null,
3637
) {
3738
$this->twigHelper = new GeneratorTwigHelper($fileManager);
38-
$this->namespacePrefix = trim($namespacePrefix, '\\');
3939

4040
if (null !== $phpCompatUtil) {
4141
trigger_deprecation('symfony/maker-bundle', 'v1.44.0', 'Initializing Generator while providing an instance of PhpCompatUtil is deprecated.');
@@ -180,7 +180,7 @@ public function getFileContentsForPendingOperation(string $targetPath): string
180180
*/
181181
public function createClassNameDetails(string $name, string $namespacePrefix, string $suffix = '', string $validationErrorMessage = ''): ClassNameDetails
182182
{
183-
$fullNamespacePrefix = $this->namespacePrefix.'\\'.$namespacePrefix;
183+
$fullNamespacePrefix = $this->namespacesHelper->getRootNamespace().'\\'.$namespacePrefix;
184184
if ('\\' === $name[0]) {
185185
// class is already "absolute" - leave it alone (but strip opening \)
186186
$className = substr($name, 1);
@@ -240,9 +240,14 @@ public function writeChanges()
240240
$this->pendingOperations = [];
241241
}
242242

243+
public function getNamespacesHelper(): NamespacesHelper
244+
{
245+
return $this->namespacesHelper;
246+
}
247+
243248
public function getRootNamespace(): string
244249
{
245-
return $this->namespacePrefix;
250+
return $this->namespacesHelper->getRootNamespace();
246251
}
247252

248253
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
@@ -69,7 +69,7 @@ public function generate(InputInterface $input, ConsoleStyle $io, Generator $gen
6969

7070
$commandClassNameDetails = $generator->createClassNameDetails(
7171
$commandNameHasAppPrefix ? substr($commandName, 4) : $commandName,
72-
'Command\\',
72+
$generator->getNamespacesHelper()->getCommandNamespace(),
7373
'Command',
7474
\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'))
7575
);

src/Maker/MakeController.php

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
use Symfony\Bundle\MakerBundle\Maker\Common\CanGenerateTestsTrait;
2121
use Symfony\Bundle\MakerBundle\Str;
2222
use Symfony\Bundle\MakerBundle\Util\ClassSource\Model\ClassData;
23+
use Symfony\Bundle\MakerBundle\Util\NamespacesHelper;
2324
use Symfony\Bundle\MakerBundle\Util\PhpCompatUtil;
2425
use Symfony\Bundle\TwigBundle\TwigBundle;
2526
use Symfony\Component\Console\Command\Command;
@@ -43,8 +44,10 @@ final class MakeController extends AbstractMaker
4344
private bool $usesTwigTemplate;
4445
private string $twigTemplatePath;
4546

46-
public function __construct(private ?PhpCompatUtil $phpCompatUtil = null)
47-
{
47+
public function __construct(
48+
private NamespacesHelper $namespacesHelper,
49+
private ?PhpCompatUtil $phpCompatUtil = null,
50+
) {
4851
if (null !== $phpCompatUtil) {
4952
@trigger_deprecation(
5053
'symfony/maker-bundle',
@@ -82,7 +85,7 @@ public function interact(InputInterface $input, ConsoleStyle $io, Command $comma
8285
$this->isInvokable = (bool) $input->getOption('invokable');
8386

8487
$controllerClass = $input->getArgument('controller-class');
85-
$controllerClassName = \sprintf('Controller\%s', $controllerClass);
88+
$controllerClassName = \sprintf('%s\%s', $this->namespacesHelper->getControllerNamespace(), $controllerClass);
8689

8790
// If the class name provided is absolute, we do not assume it will live in src/Controller
8891
// e.g. src/Custom/Location/For/MyController instead of src/Controller/MyController
@@ -92,6 +95,7 @@ public function interact(InputInterface $input, ConsoleStyle $io, Command $comma
9295

9396
$this->controllerClassData = ClassData::create(
9497
class: $controllerClassName,
98+
rootNamespace: $this->namespacesHelper->getRootNamespace(),
9599
suffix: 'Controller',
96100
extendsClass: AbstractController::class,
97101
useStatements: [
@@ -138,8 +142,15 @@ public function generate(InputInterface $input, ConsoleStyle $io, Generator $gen
138142
}
139143

140144
if ($this->shouldGenerateTests()) {
145+
$testClassName =\sprintf(
146+
'%s\%s\%s',
147+
$this->namespacesHelper->getTestNamespace(),
148+
$this->namespacesHelper->getControllerNamespace(),
149+
$this->controllerClassData->getClassName(relative: true, withoutSuffix: true)
150+
);
141151
$testClassData = ClassData::create(
142-
class: \sprintf('Tests\Controller\%s', $this->controllerClassData->getClassName(relative: true, withoutSuffix: true)),
152+
class: $testClassName,
153+
rootNamespace: $this->namespacesHelper->getRootNamespace(),
143154
suffix: 'ControllerTest',
144155
extendsClass: WebTestCase::class,
145156
);

src/Maker/MakeCrud.php

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ public function generate(InputInterface $input, ConsoleStyle $io, Generator $gen
107107
{
108108
$entityClassDetails = $generator->createClassNameDetails(
109109
Validator::entityExists($input->getArgument('entity-class'), $this->doctrineHelper->getEntitiesForAutocomplete()),
110-
'Entity\\'
110+
$generator->getNamespacesHelper()->getEntityNamespace()
111111
);
112112

113113
$entityDoctrineDetails = $this->doctrineHelper->createDoctrineDetails($entityClassDetails->getFullName());
@@ -118,7 +118,7 @@ public function generate(InputInterface $input, ConsoleStyle $io, Generator $gen
118118
if (null !== $entityDoctrineDetails->getRepositoryClass()) {
119119
$repositoryClassDetails = $generator->createClassNameDetails(
120120
'\\'.$entityDoctrineDetails->getRepositoryClass(),
121-
'Repository\\',
121+
$generator->getNamespacesHelper()->getRepositoryNamespace(),
122122
'Repository'
123123
);
124124

@@ -133,22 +133,23 @@ public function generate(InputInterface $input, ConsoleStyle $io, Generator $gen
133133

134134
$controllerClassDetails = $generator->createClassNameDetails(
135135
$this->controllerClassName,
136-
'Controller\\',
136+
$generator->getNamespacesHelper()->getControllerNamespace(),
137137
'Controller'
138138
);
139139

140140
$iter = 0;
141141
do {
142142
$formClassDetails = $generator->createClassNameDetails(
143143
$entityClassDetails->getRelativeNameWithoutSuffix().($iter ?: '').'Type',
144-
'Form\\',
144+
$generator->getNamespacesHelper()->getFormNamespace(),
145145
'Type'
146146
);
147147
++$iter;
148148
} while (class_exists($formClassDetails->getFullName()));
149149

150150
$controllerClassData = ClassData::create(
151-
class: \sprintf('Controller\%s', $this->controllerClassName),
151+
class: \sprintf('%s\%s', $generator->getNamespacesHelper()->getControllerNamespace(), $this->controllerClassName),
152+
rootNamespace: $generator->getRootNamespace(),
152153
suffix: 'Controller',
153154
extendsClass: AbstractController::class,
154155
useStatements: [
@@ -247,8 +248,15 @@ class: \sprintf('Controller\%s', $this->controllerClassName),
247248
}
248249

249250
if ($this->shouldGenerateTests()) {
251+
$testClassName =\sprintf(
252+
'%s\%s\%s',
253+
$generator->getNamespacesHelper()->getTestNamespace(),
254+
$generator->getNamespacesHelper()->getControllerNamespace(),
255+
$entityClassDetails->getRelativeNameWithoutSuffix()
256+
);
250257
$testClassData = ClassData::create(
251-
class: \sprintf('Tests\Controller\%s', $entityClassDetails->getRelativeNameWithoutSuffix()),
258+
class: $testClassName,
259+
rootNamespace: $generator->getRootNamespace(),
252260
suffix: 'ControllerTest',
253261
extendsClass: WebTestCase::class,
254262
useStatements: [

src/Maker/MakeEntity.php

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
use Symfony\Bundle\MakerBundle\Util\ClassSource\Model\ClassProperty;
3232
use Symfony\Bundle\MakerBundle\Util\ClassSourceManipulator;
3333
use Symfony\Bundle\MakerBundle\Util\CliOutputHelper;
34+
use Symfony\Bundle\MakerBundle\Util\NamespacesHelper;
3435
use Symfony\Bundle\MakerBundle\Validator;
3536
use Symfony\Bundle\MercureBundle\DependencyInjection\MercureExtension;
3637
use Symfony\Component\Console\Command\Command;
@@ -66,7 +67,7 @@ public function __construct(
6667

6768
if (null === $generator) {
6869
@trigger_error(\sprintf('Passing a "%s" instance as 4th argument is mandatory since version 1.5.', Generator::class), \E_USER_DEPRECATED);
69-
$this->generator = new Generator($fileManager, 'App\\');
70+
$this->generator = new Generator($fileManager, new NamespacesHelper());
7071
} else {
7172
$this->generator = $generator;
7273
}
@@ -142,7 +143,7 @@ public function interact(InputInterface $input, ConsoleStyle $io, Command $comma
142143
if (
143144
!$input->getOption('api-resource')
144145
&& class_exists(ApiResource::class)
145-
&& !class_exists($this->generator->createClassNameDetails($entityClassName, 'Entity\\')->getFullName())
146+
&& !class_exists($this->generator->createClassNameDetails($entityClassName, $this->getEntityNamespace())->getFullName())
146147
) {
147148
$description = $command->getDefinition()->getOption('api-resource')->getDescription();
148149
$question = new ConfirmationQuestion($description, false);
@@ -154,7 +155,7 @@ public function interact(InputInterface $input, ConsoleStyle $io, Command $comma
154155
if (
155156
!$input->getOption('broadcast')
156157
&& class_exists(Broadcast::class)
157-
&& !class_exists($this->generator->createClassNameDetails($entityClassName, 'Entity\\')->getFullName())
158+
&& !class_exists($this->generator->createClassNameDetails($entityClassName, $this->getEntityNamespace())->getFullName())
158159
) {
159160
$description = $command->getDefinition()->getOption('broadcast')->getDescription();
160161
$question = new ConfirmationQuestion($description, false);
@@ -183,7 +184,7 @@ public function generate(InputInterface $input, ConsoleStyle $io, Generator $gen
183184

184185
$entityClassDetails = $generator->createClassNameDetails(
185186
$input->getArgument('name'),
186-
'Entity\\'
187+
$this->getEntityNamespace()
187188
);
188189

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

src/Maker/MakeFixtures.php

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

5959
$useStatements = new UseStatementGenerator([

src/Maker/MakeForm.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ public function generate(InputInterface $input, ConsoleStyle $io, Generator $gen
7979
{
8080
$formClassNameDetails = $generator->createClassNameDetails(
8181
$input->getArgument('name'),
82-
'Form\\',
82+
$generator->getNamespacesHelper()->getFormNamespace(),
8383
'Type'
8484
);
8585

@@ -91,7 +91,7 @@ public function generate(InputInterface $input, ConsoleStyle $io, Generator $gen
9191
if (null !== $boundClass) {
9292
$boundClassDetails = $generator->createClassNameDetails(
9393
$boundClass,
94-
'Entity\\'
94+
$generator->getNamespacesHelper()->getEntityNamespace()
9595
);
9696

9797
$doctrineEntityDetails = $this->entityHelper->createDoctrineDetails($boundClassDetails->getFullName());

src/Maker/MakeFunctionalTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ public function generate(InputInterface $input, ConsoleStyle $io, Generator $gen
5858
{
5959
$testClassNameDetails = $generator->createClassNameDetails(
6060
$input->getArgument('name'),
61-
'Tests\\',
61+
$generator->getNamespacesHelper()->getTestNamespace(),
6262
'Test'
6363
);
6464

src/Maker/MakeListener.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ private function generateSubscriberClass(InputInterface $input, ConsoleStyle $io
191191
{
192192
$subscriberClassNameDetails = $generator->createClassNameDetails(
193193
$input->getArgument('name'),
194-
'EventSubscriber\\',
194+
$generator->getNamespacesHelper()->getSubscriberNamespace(),
195195
'Subscriber'
196196
);
197197

@@ -220,7 +220,7 @@ private function generateListenerClass(InputInterface $input, ConsoleStyle $io,
220220
{
221221
$listenerClassNameDetails = $generator->createClassNameDetails(
222222
$input->getArgument('name'),
223-
'EventListener\\',
223+
$generator->getNamespacesHelper()->getListenerNamespace(),
224224
'Listener'
225225
);
226226

0 commit comments

Comments
 (0)