diff --git a/src/Generator.php b/src/Generator.php index 221899d07..7804c8340 100644 --- a/src/Generator.php +++ b/src/Generator.php @@ -27,21 +27,37 @@ class Generator private GeneratorTwigHelper $twigHelper; private array $pendingOperations = []; private array $generatedFiles = []; + private array $configuredNamespaces; public function __construct( private FileManager $fileManager, private string $namespacePrefix, ?PhpCompatUtil $phpCompatUtil = null, private ?TemplateComponentGenerator $templateComponentGenerator = null, + array $configuredNamespaces = [], ) { $this->twigHelper = new GeneratorTwigHelper($fileManager); $this->namespacePrefix = trim($namespacePrefix, '\\'); + $defaults = []; + foreach (NamespaceType::cases() as $case) { + $defaults[$case->value] = $case->defaultNamespace(); + } + $this->configuredNamespaces = array_merge($defaults, $configuredNamespaces); + if (null !== $phpCompatUtil) { trigger_deprecation('symfony/maker-bundle', 'v1.44.0', 'Initializing Generator while providing an instance of PhpCompatUtil is deprecated.'); } } + /** + * Returns the configured namespace prefix for a given type. + */ + public function getNamespace(NamespaceType $type): string + { + return $this->configuredNamespaces[$type->value]; + } + /** * Generate a new file for a class from a template. * diff --git a/src/Maker/MakeAuthenticator.php b/src/Maker/MakeAuthenticator.php index 3f7c9e417..209842852 100644 --- a/src/Maker/MakeAuthenticator.php +++ b/src/Maker/MakeAuthenticator.php @@ -13,6 +13,7 @@ use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Bundle\MakerBundle\ConsoleStyle; +use Symfony\Bundle\MakerBundle\NamespaceType; use Symfony\Bundle\MakerBundle\DependencyBuilder; use Symfony\Bundle\MakerBundle\Doctrine\DoctrineHelper; use Symfony\Bundle\MakerBundle\Exception\RuntimeCommandException; @@ -330,7 +331,7 @@ private function generateAuthenticatorClass(array $securityData, string $authent $userClassNameDetails = $this->generator->createClassNameDetails( '\\'.$userClass, - 'Entity\\' + $this->generator->getNamespace(NamespaceType::Entity).'\\' ); $this->generator->generateClass( @@ -354,7 +355,7 @@ private function generateFormLoginFiles(string $controllerClass, string $userNam { $controllerClassNameDetails = $this->generator->createClassNameDetails( $controllerClass, - 'Controller\\', + $this->generator->getNamespace(NamespaceType::Controller).'\\', 'Controller' ); diff --git a/src/Maker/MakeCommand.php b/src/Maker/MakeCommand.php index 52d331c53..1db885b91 100644 --- a/src/Maker/MakeCommand.php +++ b/src/Maker/MakeCommand.php @@ -12,6 +12,7 @@ namespace Symfony\Bundle\MakerBundle\Maker; use Symfony\Bundle\MakerBundle\ConsoleStyle; +use Symfony\Bundle\MakerBundle\NamespaceType; use Symfony\Bundle\MakerBundle\DependencyBuilder; use Symfony\Bundle\MakerBundle\Generator; use Symfony\Bundle\MakerBundle\InputConfiguration; @@ -69,7 +70,7 @@ public function generate(InputInterface $input, ConsoleStyle $io, Generator $gen $commandClassNameDetails = $generator->createClassNameDetails( $commandNameHasAppPrefix ? substr($commandName, 4) : $commandName, - 'Command\\', + $generator->getNamespace(NamespaceType::Command).'\\', 'Command', \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')) ); diff --git a/src/Maker/MakeController.php b/src/Maker/MakeController.php index 3b0aaf079..4cc812637 100644 --- a/src/Maker/MakeController.php +++ b/src/Maker/MakeController.php @@ -14,6 +14,7 @@ use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; use Symfony\Bundle\MakerBundle\ConsoleStyle; +use Symfony\Bundle\MakerBundle\NamespaceType; use Symfony\Bundle\MakerBundle\DependencyBuilder; use Symfony\Bundle\MakerBundle\Generator; use Symfony\Bundle\MakerBundle\InputConfiguration; @@ -39,9 +40,8 @@ final class MakeController extends AbstractMaker use CanGenerateTestsTrait; private bool $isInvokable; - private ClassData $controllerClassData; private bool $usesTwigTemplate; - private string $twigTemplatePath; + private string $controllerClass; public function __construct(private ?PhpCompatUtil $phpCompatUtil = null) { @@ -80,17 +80,23 @@ public function interact(InputInterface $input, ConsoleStyle $io, Command $comma { $this->usesTwigTemplate = $this->isTwigInstalled() && !$input->getOption('no-template'); $this->isInvokable = (bool) $input->getOption('invokable'); + $this->controllerClass = $input->getArgument('controller-class'); - $controllerClass = $input->getArgument('controller-class'); - $controllerClassName = \sprintf('Controller\%s', $controllerClass); + $this->interactSetGenerateTests($input, $io); + } + + public function generate(InputInterface $input, ConsoleStyle $io, Generator $generator): void + { + $controllerNamespace = $generator->getNamespace(NamespaceType::Controller); + $controllerClassName = \sprintf('%s\%s', $controllerNamespace, $this->controllerClass); // If the class name provided is absolute, we do not assume it will live in src/Controller // e.g. src/Custom/Location/For/MyController instead of src/Controller/MyController - if ($isAbsoluteNamespace = '\\' === $controllerClass[0]) { - $controllerClassName = substr($controllerClass, 1); + if ($isAbsoluteNamespace = '\\' === $this->controllerClass[0]) { + $controllerClassName = substr($this->controllerClass, 1); } - $this->controllerClassData = ClassData::create( + $controllerClassData = ClassData::create( class: $controllerClassName, suffix: 'Controller', extendsClass: AbstractController::class, @@ -105,47 +111,42 @@ class: $controllerClassName, // templates/my/controller.html.twig. We do however remove the root_namespace prefix in either case // so we don't end up with templates/app/my/controller.html.twig $templateName = $isAbsoluteNamespace ? - $this->controllerClassData->getFullClassName(withoutRootNamespace: true, withoutSuffix: true) : - $this->controllerClassData->getClassName(relative: true, withoutSuffix: true) + $controllerClassData->getFullClassName(withoutRootNamespace: true, withoutSuffix: true) : + $controllerClassData->getClassName(relative: true, withoutSuffix: true) ; // Convert the Twig template name into a file path where it will be generated. - $this->twigTemplatePath = \sprintf('%s%s', Str::asFilePath($templateName), $this->isInvokable ? '.html.twig' : '/index.html.twig'); + $twigTemplatePath = \sprintf('%s%s', Str::asFilePath($templateName), $this->isInvokable ? '.html.twig' : '/index.html.twig'); - $this->interactSetGenerateTests($input, $io); - } - - public function generate(InputInterface $input, ConsoleStyle $io, Generator $generator): void - { - $controllerPath = $generator->generateClassFromClassData($this->controllerClassData, 'controller/Controller.tpl.php', [ - 'route_path' => Str::asRoutePath($this->controllerClassData->getClassName(relative: true, withoutSuffix: true)), - 'route_name' => Str::AsRouteName($this->controllerClassData->getClassName(relative: true, withoutSuffix: true)), + $controllerPath = $generator->generateClassFromClassData($controllerClassData, 'controller/Controller.tpl.php', [ + 'route_path' => Str::asRoutePath($controllerClassData->getClassName(relative: true, withoutSuffix: true)), + 'route_name' => Str::AsRouteName($controllerClassData->getClassName(relative: true, withoutSuffix: true)), 'method_name' => $this->isInvokable ? '__invoke' : 'index', 'with_template' => $this->usesTwigTemplate, - 'template_name' => $this->twigTemplatePath, + 'template_name' => $twigTemplatePath, ], true); if ($this->usesTwigTemplate) { $generator->generateTemplate( - $this->twigTemplatePath, + $twigTemplatePath, 'controller/twig_template.tpl.php', [ 'controller_path' => $controllerPath, 'root_directory' => $generator->getRootDirectory(), - 'class_name' => $this->controllerClassData->getClassName(), + 'class_name' => $controllerClassData->getClassName(), ] ); } if ($this->shouldGenerateTests()) { $testClassData = ClassData::create( - class: \sprintf('Tests\Controller\%s', $this->controllerClassData->getClassName(relative: true, withoutSuffix: true)), + class: \sprintf('Tests\%s\%s', $controllerNamespace, $controllerClassData->getClassName(relative: true, withoutSuffix: true)), suffix: 'ControllerTest', extendsClass: WebTestCase::class, ); $generator->generateClassFromClassData($testClassData, 'controller/test/Test.tpl.php', [ - 'route_path' => Str::asRoutePath($this->controllerClassData->getClassName(relative: true, withoutSuffix: true)), + 'route_path' => Str::asRoutePath($controllerClassData->getClassName(relative: true, withoutSuffix: true)), ]); if (!class_exists(WebTestCase::class)) { diff --git a/src/Maker/MakeCrud.php b/src/Maker/MakeCrud.php index f535d24bd..fb77fbed5 100644 --- a/src/Maker/MakeCrud.php +++ b/src/Maker/MakeCrud.php @@ -20,6 +20,7 @@ use Symfony\Bundle\FrameworkBundle\KernelBrowser; use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; use Symfony\Bundle\MakerBundle\ConsoleStyle; +use Symfony\Bundle\MakerBundle\NamespaceType; use Symfony\Bundle\MakerBundle\DependencyBuilder; use Symfony\Bundle\MakerBundle\Doctrine\DoctrineHelper; use Symfony\Bundle\MakerBundle\Generator; @@ -107,7 +108,7 @@ public function generate(InputInterface $input, ConsoleStyle $io, Generator $gen { $entityClassDetails = $generator->createClassNameDetails( Validator::entityExists($input->getArgument('entity-class'), $this->doctrineHelper->getEntitiesForAutocomplete()), - 'Entity\\' + $generator->getNamespace(NamespaceType::Entity).'\\' ); $entityDoctrineDetails = $this->doctrineHelper->createDoctrineDetails($entityClassDetails->getFullName()); @@ -118,7 +119,7 @@ public function generate(InputInterface $input, ConsoleStyle $io, Generator $gen if (null !== $entityDoctrineDetails->getRepositoryClass()) { $repositoryClassDetails = $generator->createClassNameDetails( '\\'.$entityDoctrineDetails->getRepositoryClass(), - 'Repository\\', + $generator->getNamespace(NamespaceType::Repository).'\\', 'Repository' ); @@ -133,7 +134,7 @@ public function generate(InputInterface $input, ConsoleStyle $io, Generator $gen $controllerClassDetails = $generator->createClassNameDetails( $this->controllerClassName, - 'Controller\\', + $generator->getNamespace(NamespaceType::Controller).'\\', 'Controller' ); @@ -141,14 +142,14 @@ public function generate(InputInterface $input, ConsoleStyle $io, Generator $gen do { $formClassDetails = $generator->createClassNameDetails( $entityClassDetails->getRelativeNameWithoutSuffix().($iter ?: '').'Type', - 'Form\\', + $generator->getNamespace(NamespaceType::Form).'\\', 'Type' ); ++$iter; } while (class_exists($formClassDetails->getFullName())); $controllerClassData = ClassData::create( - class: \sprintf('Controller\%s', $this->controllerClassName), + class: \sprintf('%s\%s', $generator->getNamespace(NamespaceType::Controller), $this->controllerClassName), suffix: 'Controller', extendsClass: AbstractController::class, useStatements: [ diff --git a/src/Maker/MakeEntity.php b/src/Maker/MakeEntity.php index 76d18322c..3afca4a46 100644 --- a/src/Maker/MakeEntity.php +++ b/src/Maker/MakeEntity.php @@ -14,6 +14,7 @@ use ApiPlatform\Metadata\ApiResource; use Doctrine\DBAL\Types\Type; use Symfony\Bundle\MakerBundle\ConsoleStyle; +use Symfony\Bundle\MakerBundle\NamespaceType; use Symfony\Bundle\MakerBundle\DependencyBuilder; use Symfony\Bundle\MakerBundle\Doctrine\DoctrineHelper; use Symfony\Bundle\MakerBundle\Doctrine\EntityClassGenerator; @@ -143,7 +144,7 @@ public function interact(InputInterface $input, ConsoleStyle $io, Command $comma if ( !$input->getOption('api-resource') && class_exists(ApiResource::class) - && !class_exists($this->generator->createClassNameDetails($entityClassName, 'Entity\\')->getFullName()) + && !class_exists($this->generator->createClassNameDetails($entityClassName, $this->generator->getNamespace(NamespaceType::Entity).'\\')->getFullName()) ) { $description = $command->getDefinition()->getOption('api-resource')->getDescription(); $question = new ConfirmationQuestion($description, false); @@ -155,7 +156,7 @@ public function interact(InputInterface $input, ConsoleStyle $io, Command $comma if ( !$input->getOption('broadcast') && class_exists(Broadcast::class) - && !class_exists($this->generator->createClassNameDetails($entityClassName, 'Entity\\')->getFullName()) + && !class_exists($this->generator->createClassNameDetails($entityClassName, $this->generator->getNamespace(NamespaceType::Entity).'\\')->getFullName()) ) { $description = $command->getDefinition()->getOption('broadcast')->getDescription(); $question = new ConfirmationQuestion($description, false); @@ -184,7 +185,7 @@ public function generate(InputInterface $input, ConsoleStyle $io, Generator $gen $entityClassDetails = $generator->createClassNameDetails( $input->getArgument('name'), - 'Entity\\' + $generator->getNamespace(NamespaceType::Entity).'\\' ); $classExists = class_exists($entityClassDetails->getFullName()); diff --git a/src/Maker/MakeForm.php b/src/Maker/MakeForm.php index c2439bea8..921ab2389 100644 --- a/src/Maker/MakeForm.php +++ b/src/Maker/MakeForm.php @@ -13,6 +13,7 @@ use Doctrine\Bundle\DoctrineBundle\DoctrineBundle; use Symfony\Bundle\MakerBundle\ConsoleStyle; +use Symfony\Bundle\MakerBundle\NamespaceType; use Symfony\Bundle\MakerBundle\DependencyBuilder; use Symfony\Bundle\MakerBundle\Doctrine\DoctrineHelper; use Symfony\Bundle\MakerBundle\Generator; @@ -79,7 +80,7 @@ public function generate(InputInterface $input, ConsoleStyle $io, Generator $gen { $formClassNameDetails = $generator->createClassNameDetails( $input->getArgument('name'), - 'Form\\', + $generator->getNamespace(NamespaceType::Form).'\\', 'Type' ); @@ -91,7 +92,7 @@ public function generate(InputInterface $input, ConsoleStyle $io, Generator $gen if (null !== $boundClass) { $boundClassDetails = $generator->createClassNameDetails( $boundClass, - 'Entity\\' + $generator->getNamespace(NamespaceType::Entity).'\\' ); $doctrineEntityDetails = $this->entityHelper->createDoctrineDetails($boundClassDetails->getFullName()); diff --git a/src/Maker/MakeRegistrationForm.php b/src/Maker/MakeRegistrationForm.php index 01c09d229..fdc39df00 100644 --- a/src/Maker/MakeRegistrationForm.php +++ b/src/Maker/MakeRegistrationForm.php @@ -21,6 +21,7 @@ use Symfony\Bundle\FrameworkBundle\KernelBrowser; use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; use Symfony\Bundle\MakerBundle\ConsoleStyle; +use Symfony\Bundle\MakerBundle\NamespaceType; use Symfony\Bundle\MakerBundle\DependencyBuilder; use Symfony\Bundle\MakerBundle\Doctrine\DoctrineHelper; use Symfony\Bundle\MakerBundle\Exception\RuntimeCommandException; @@ -214,8 +215,7 @@ private function interactAuthenticatorQuestions(ConsoleStyle $io, InteractiveSec public function generate(InputInterface $input, ConsoleStyle $io, Generator $generator): void { $userClassNameDetails = $generator->createClassNameDetails( - '\\'.$this->userClass, - 'Entity\\' + '\\'.$this->userClass, $generator->getNamespace(NamespaceType::Entity).'\\' ); $userDoctrineDetails = $this->doctrineHelper->createDoctrineDetails($userClassNameDetails->getFullName()); @@ -229,7 +229,7 @@ public function generate(InputInterface $input, ConsoleStyle $io, Generator $gen $userRepository = $userDoctrineDetails->getRepositoryClass(); if (null !== $userRepository) { - $userRepoClassDetails = $generator->createClassNameDetails('\\'.$userRepository, 'Repository\\', 'Repository'); + $userRepoClassDetails = $generator->createClassNameDetails('\\'.$userRepository, $generator->getNamespace(NamespaceType::Repository).'\\', 'Repository'); $userRepoVars = [ 'repository_full_class_name' => $userRepoClassDetails->getFullName(), @@ -297,7 +297,7 @@ public function generate(InputInterface $input, ConsoleStyle $io, Generator $gen // 2) Generate the controller $controllerClassNameDetails = $generator->createClassNameDetails( 'RegistrationController', - 'Controller\\' + $generator->getNamespace(NamespaceType::Controller).'\\' ); $useStatements = new UseStatementGenerator([ @@ -549,7 +549,7 @@ private function generateFormClass(ClassNameDetails $userClassDetails, Generator { $formClassDetails = $generator->createClassNameDetails( 'RegistrationFormType', - 'Form\\' + $generator->getNamespace(NamespaceType::Form).'\\' ); $formFields = [ diff --git a/src/Maker/MakeResetPassword.php b/src/Maker/MakeResetPassword.php index ba55cfe65..f7a1dd027 100644 --- a/src/Maker/MakeResetPassword.php +++ b/src/Maker/MakeResetPassword.php @@ -19,6 +19,7 @@ use Symfony\Bundle\FrameworkBundle\KernelBrowser; use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; use Symfony\Bundle\MakerBundle\ConsoleStyle; +use Symfony\Bundle\MakerBundle\NamespaceType; use Symfony\Bundle\MakerBundle\DependencyBuilder; use Symfony\Bundle\MakerBundle\Doctrine\DoctrineHelper; use Symfony\Bundle\MakerBundle\Doctrine\EntityClassGenerator; @@ -209,32 +210,32 @@ public function generate(InputInterface $input, ConsoleStyle $io, Generator $gen { $userClassNameDetails = $generator->createClassNameDetails( '\\'.$this->userClass, - 'Entity\\' + $generator->getNamespace(NamespaceType::Entity).'\\' ); $controllerClassNameDetails = $generator->createClassNameDetails( 'ResetPasswordController', - 'Controller\\' + $generator->getNamespace(NamespaceType::Controller).'\\' ); $requestClassNameDetails = $generator->createClassNameDetails( 'ResetPasswordRequest', - 'Entity\\' + $generator->getNamespace(NamespaceType::Entity).'\\' ); $repositoryClassNameDetails = $generator->createClassNameDetails( 'ResetPasswordRequestRepository', - 'Repository\\' + $generator->getNamespace(NamespaceType::Repository).'\\' ); $requestFormTypeClassNameDetails = $generator->createClassNameDetails( 'ResetPasswordRequestFormType', - 'Form\\' + $generator->getNamespace(NamespaceType::Form).'\\' ); $changePasswordFormTypeClassNameDetails = $generator->createClassNameDetails( 'ChangePasswordFormType', - 'Form\\' + $generator->getNamespace(NamespaceType::Form).'\\' ); $useStatements = new UseStatementGenerator([ @@ -359,7 +360,7 @@ public function generate(InputInterface $input, ConsoleStyle $io, Generator $gen $userRepositoryDetails = $generator->createClassNameDetails( \sprintf('%sRepository', $userClassNameDetails->getShortName()), - 'Repository\\' + $generator->getNamespace(NamespaceType::Repository).'\\' ); $useStatements = new UseStatementGenerator([ diff --git a/src/Maker/MakeSerializerNormalizer.php b/src/Maker/MakeSerializerNormalizer.php index 39381ece1..c2b401d36 100644 --- a/src/Maker/MakeSerializerNormalizer.php +++ b/src/Maker/MakeSerializerNormalizer.php @@ -12,6 +12,7 @@ namespace Symfony\Bundle\MakerBundle\Maker; use Symfony\Bundle\MakerBundle\ConsoleStyle; +use Symfony\Bundle\MakerBundle\NamespaceType; use Symfony\Bundle\MakerBundle\DependencyBuilder; use Symfony\Bundle\MakerBundle\FileManager; use Symfony\Bundle\MakerBundle\Generator; @@ -74,7 +75,7 @@ public function generate(InputInterface $input, ConsoleStyle $io, Generator $gen $entityDetails = $generator->createClassNameDetails( str_replace('Normalizer', '', $normalizerClassNameDetails->getShortName()), - 'Entity\\', + $generator->getNamespace(NamespaceType::Entity).'\\', ); if ($entityExists = class_exists($entityDetails->getFullName())) { diff --git a/src/Maker/MakeUser.php b/src/Maker/MakeUser.php index 8bdcb0cc6..9c2df8b52 100644 --- a/src/Maker/MakeUser.php +++ b/src/Maker/MakeUser.php @@ -13,6 +13,7 @@ use Doctrine\Bundle\DoctrineBundle\DoctrineBundle; use Symfony\Bundle\MakerBundle\ConsoleStyle; +use Symfony\Bundle\MakerBundle\NamespaceType; use Symfony\Bundle\MakerBundle\DependencyBuilder; use Symfony\Bundle\MakerBundle\Doctrine\DoctrineHelper; use Symfony\Bundle\MakerBundle\Doctrine\EntityClassGenerator; @@ -130,7 +131,7 @@ public function generate(InputInterface $input, ConsoleStyle $io, Generator $gen $userClassNameDetails = $generator->createClassNameDetails( $input->getArgument('name'), - $userClassConfiguration->isEntity() ? 'Entity\\' : 'Security\\' + $userClassConfiguration->isEntity() ? $generator->getNamespace(NamespaceType::Entity).'\\' : 'Security\\' ); // A) Generate the User class diff --git a/src/MakerBundle.php b/src/MakerBundle.php index 0e6235c83..50fdd113c 100644 --- a/src/MakerBundle.php +++ b/src/MakerBundle.php @@ -41,6 +41,15 @@ public function configure(DefinitionConfigurator $definition): void ->end() ->booleanNode('generate_final_classes')->defaultTrue()->end() ->booleanNode('generate_final_entities')->defaultFalse()->end() + ->arrayNode('namespaces') + ->useAttributeAsKey('type') + ->scalarPrototype() + ->validate() + ->ifString() + ->then(Validator::validateClassName(...)) + ->end() + ->end() + ->end() ->end() ; } @@ -51,14 +60,17 @@ public function loadExtension(array $config, ContainerConfigurator $container, C $container->import('../config/makers.php'); $rootNamespace = trim($config['root_namespace'], '\\'); + $namespaces = $config['namespaces'] ?? []; + $entityNamespace = $namespaces['entity'] ?? 'Entity'; $container->services() ->get('maker.autoloader_finder') ->arg(0, $rootNamespace) ->get('maker.generator') ->arg(1, $rootNamespace) + ->arg(4, $namespaces) ->get('maker.doctrine_helper') - ->arg(0, \sprintf('%s\\Entity', $rootNamespace)) + ->arg(0, \sprintf('%s\\%s', $rootNamespace, $entityNamespace)) ->get('maker.template_component_generator') ->arg(0, $config['generate_final_classes']) ->arg(1, $config['generate_final_entities']) diff --git a/src/NamespaceType.php b/src/NamespaceType.php new file mode 100644 index 000000000..3ab49a073 --- /dev/null +++ b/src/NamespaceType.php @@ -0,0 +1,32 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Bundle\MakerBundle; + +enum NamespaceType: string +{ + case Controller = 'controller'; + case Command = 'command'; + case Entity = 'entity'; + case Form = 'form'; + case Repository = 'repository'; + + public function defaultNamespace(): string + { + return match ($this) { + self::Controller => 'Controller', + self::Command => 'Command', + self::Entity => 'Entity', + self::Form => 'Form', + self::Repository => 'Repository', + }; + } +} diff --git a/tests/BundleConfigurationTest.php b/tests/BundleConfigurationTest.php index 7f71109cb..525a14b1d 100644 --- a/tests/BundleConfigurationTest.php +++ b/tests/BundleConfigurationTest.php @@ -28,6 +28,7 @@ public function testDefaultConfiguration() $this->assertSame('App', $config['root_namespace']); $this->assertTrue($config['generate_final_classes']); $this->assertFalse($config['generate_final_entities']); + $this->assertSame([], $config['namespaces']); } public function testAllOptionsConfigured() @@ -45,6 +46,25 @@ public function testAllOptionsConfigured() $this->assertTrue($config['generate_final_entities']); } + public function testCustomNamespaces() + { + $config = $this->processConfiguration([ + 'maker' => [ + 'namespaces' => [ + 'entity' => 'Domain\\Entity', + 'controller' => 'Application\\Controller', + 'repository' => 'Infrastructure\\Repository', + ], + ], + ]); + + $this->assertSame('Domain\\Entity', $config['namespaces']['entity']); + $this->assertSame('Application\\Controller', $config['namespaces']['controller']); + $this->assertSame('Infrastructure\\Repository', $config['namespaces']['repository']); + $this->assertArrayNotHasKey('command', $config['namespaces']); + $this->assertArrayNotHasKey('form', $config['namespaces']); + } + public function testInvalidRootNamespaceWithReservedKeyword() { $this->expectException(InvalidConfigurationException::class); diff --git a/tests/GeneratorTest.php b/tests/GeneratorTest.php index e9807a820..b973601c7 100644 --- a/tests/GeneratorTest.php +++ b/tests/GeneratorTest.php @@ -15,6 +15,7 @@ use PHPUnit\Framework\TestCase; use Symfony\Bundle\MakerBundle\FileManager; use Symfony\Bundle\MakerBundle\Generator; +use Symfony\Bundle\MakerBundle\NamespaceType; class GeneratorTest extends TestCase { @@ -103,4 +104,42 @@ public static function getClassNameDetailsTests(): \Generator 'Symfony\\Bundle\\MakerBundle\\Tests\\GeneratorTest', ]; } + + public function testGetNamespaceWithConfiguredValue() + { + $fileManager = $this->createMock(FileManager::class); + $generator = new Generator($fileManager, 'App\\', null, null, [ + 'entity' => 'Domain\\Entity', + 'controller' => 'Application\\Controller', + ]); + + $this->assertSame('Domain\\Entity', $generator->getNamespace(NamespaceType::Entity)); + $this->assertSame('Application\\Controller', $generator->getNamespace(NamespaceType::Controller)); + } + + public function testGetNamespaceFallsBackToDefault() + { + $fileManager = $this->createMock(FileManager::class); + $generator = new Generator($fileManager, 'App\\'); + + $this->assertSame('Entity', $generator->getNamespace(NamespaceType::Entity)); + $this->assertSame('Command', $generator->getNamespace(NamespaceType::Command)); + } + + public function testCreateClassNameDetailsWithConfiguredNamespace() + { + $fileManager = $this->createMock(FileManager::class); + $fileManager->expects($this->any()) + ->method('getNamespacePrefixForClass') + ->willReturn('Foo'); + + $generator = new Generator($fileManager, 'App\\', null, null, [ + 'entity' => 'Domain\\Entity', + ]); + + $entityNamespace = $generator->getNamespace(NamespaceType::Entity).'\\'; + $classNameDetails = $generator->createClassNameDetails('User', $entityNamespace); + + $this->assertSame('App\\Domain\\Entity\\User', $classNameDetails->getFullName()); + } }