From aebed951dda61c71f7acb190a5a40c900fcf336f Mon Sep 17 00:00:00 2001 From: Bastien Serprix Date: Mon, 10 Sep 2018 17:52:03 +0200 Subject: [PATCH] Add new "root_entity_directory" configuration and "rootdir" option in the "make:entity" command --- src/DependencyInjection/Configuration.php | 1 + src/DependencyInjection/MakerExtension.php | 5 +++++ src/Maker/MakeEntity.php | 23 ++++++++++++---------- src/Resources/config/makers.xml | 1 + 4 files changed, 20 insertions(+), 10 deletions(-) diff --git a/src/DependencyInjection/Configuration.php b/src/DependencyInjection/Configuration.php index c06526748..c26149b53 100644 --- a/src/DependencyInjection/Configuration.php +++ b/src/DependencyInjection/Configuration.php @@ -27,6 +27,7 @@ public function getConfigTreeBuilder() $rootNode ->children() ->scalarNode('root_namespace')->defaultValue('App')->end() + ->scalarNode('root_entity_directory')->defaultValue('src/Entity/')->end() ->end() ; diff --git a/src/DependencyInjection/MakerExtension.php b/src/DependencyInjection/MakerExtension.php index 575408fa1..12eacdd86 100644 --- a/src/DependencyInjection/MakerExtension.php +++ b/src/DependencyInjection/MakerExtension.php @@ -37,6 +37,11 @@ public function load(array $configs, ContainerBuilder $container) $configuration = $this->getConfiguration($configs, $container); $config = $this->processConfiguration($configuration, $configs); + $rootEntityDirectory = trim($config['root_entity_directory']); + + $makeEntityCommandDefinition = $container->getDefinition('maker.maker.make_entity'); + $makeEntityCommandDefinition->replaceArgument(3, $rootEntityDirectory); + $rootNamespace = trim($config['root_namespace'], '\\'); $makeCommandDefinition = $container->getDefinition('maker.generator'); diff --git a/src/Maker/MakeEntity.php b/src/Maker/MakeEntity.php index 47d426fc4..1c74a16d7 100644 --- a/src/Maker/MakeEntity.php +++ b/src/Maker/MakeEntity.php @@ -47,11 +47,13 @@ final class MakeEntity extends AbstractMaker implements InputAwareMakerInterface private $fileManager; private $doctrineHelper; private $generator; + private $rootEntityDirectory; - public function __construct(FileManager $fileManager, DoctrineHelper $doctrineHelper, string $projectDirectory, Generator $generator = null) + public function __construct(FileManager $fileManager, DoctrineHelper $doctrineHelper, string $projectDirectory, string $rootEntityDirectory, Generator $generator = null) { $this->fileManager = $fileManager; $this->doctrineHelper = $doctrineHelper; + $this->rootEntityDirectory = $rootEntityDirectory; // $projectDirectory is unused, argument kept for BC if (null === $generator) { @@ -75,6 +77,7 @@ public function configureCommand(Command $command, InputConfiguration $inputConf ->addOption('api-resource', 'a', InputOption::VALUE_NONE, 'Mark this class as an API Platform resource (expose a CRUD API for it)') ->addOption('regenerate', null, InputOption::VALUE_NONE, 'Instead of adding new fields, simply generate the methods (e.g. getter/setter) for existing fields') ->addOption('overwrite', null, InputOption::VALUE_NONE, 'Overwrite any existing getter/setter methods') + ->addOption('rootdir', null, InputOption::VALUE_OPTIONAL, 'Allow you to define a custom root directory, instead of the one by default. Can also be configured with "root_entity_directory" from the bundle conf', $this->rootEntityDirectory) ->setHelp(file_get_contents(__DIR__.'/../Resources/help/MakeEntity.txt')) ; @@ -99,7 +102,7 @@ public function interact(InputInterface $input, ConsoleStyle $io, Command $comma return; } - $entityFinder = $this->fileManager->createFinder('src/Entity/') + $entityFinder = $this->fileManager->createFinder($input->getOption('rootdir')) // remove if/when we allow entities in subdirectories ->depth('<1') ->name('*.php'); @@ -114,7 +117,7 @@ public function interact(InputInterface $input, ConsoleStyle $io, Command $comma } $argument = $command->getDefinition()->getArgument('name'); - $question = $this->createEntityClassQuestion($argument->getDescription()); + $question = $this->createEntityClassQuestion($argument->getDescription(), $input); $value = $io->askQuestion($question); $input->setArgument('name', $value); @@ -182,7 +185,7 @@ public function generate(InputInterface $input, ConsoleStyle $io, Generator $gen $isFirstField = true; while (true) { - $newField = $this->askForNextField($io, $currentFields, $entityClassDetails->getFullName(), $isFirstField); + $newField = $this->askForNextField($input, $io, $currentFields, $entityClassDetails->getFullName(), $isFirstField); $isFirstField = false; if (null === $newField) { @@ -284,7 +287,7 @@ public function configureDependencies(DependencyBuilder $dependencies, InputInte ORMDependencyBuilder::buildDependencies($dependencies); } - private function askForNextField(ConsoleStyle $io, array $fields, string $entityClass, bool $isFirstField) + private function askForNextField(InputInterface $input, ConsoleStyle $io, array $fields, string $entityClass, bool $isFirstField) { $io->writeln(''); @@ -352,7 +355,7 @@ private function askForNextField(ConsoleStyle $io, array $fields, string $entity } if ('relation' === $type || \in_array($type, EntityRelation::getValidRelationTypes())) { - return $this->askRelationDetails($io, $entityClass, $type, $fieldName); + return $this->askRelationDetails($input, $io, $entityClass, $type, $fieldName); } // this is a normal field @@ -453,9 +456,9 @@ private function printAvailableTypes(ConsoleStyle $io) $printSection($allTypes); } - private function createEntityClassQuestion(string $questionText): Question + private function createEntityClassQuestion(string $questionText, InputInterface $input): Question { - $entityFinder = $this->fileManager->createFinder('src/Entity/') + $entityFinder = $this->fileManager->createFinder($input->getOption('rootdir')) // remove if/when we allow entities in subdirectories ->depth('<1') ->name('*.php'); @@ -476,12 +479,12 @@ private function createEntityClassQuestion(string $questionText): Question return $question; } - private function askRelationDetails(ConsoleStyle $io, string $generatedEntityClass, string $type, string $newFieldName) + private function askRelationDetails(InputInterface $input, ConsoleStyle $io, string $generatedEntityClass, string $type, string $newFieldName) { // ask the targetEntity $targetEntityClass = null; while (null === $targetEntityClass) { - $question = $this->createEntityClassQuestion('What class should this entity be related to?'); + $question = $this->createEntityClassQuestion('What class should this entity be related to?', $input); $targetEntityClass = $io->askQuestion($question); diff --git a/src/Resources/config/makers.xml b/src/Resources/config/makers.xml index 9994bb5f9..05193fb90 100644 --- a/src/Resources/config/makers.xml +++ b/src/Resources/config/makers.xml @@ -29,6 +29,7 @@ %kernel.project_dir% +