Skip to content

Commit 4b42eca

Browse files
committed
check table name using naming strategy
1 parent 966c355 commit 4b42eca

File tree

9 files changed

+25
-81
lines changed

9 files changed

+25
-81
lines changed

src/Doctrine/DoctrineHelper.php

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,10 @@
1616
use Doctrine\Common\Persistence\Mapping\Driver\MappingDriver as LegacyMappingDriver;
1717
use Doctrine\Common\Persistence\Mapping\MappingException as LegacyPersistenceMappingException;
1818
use Doctrine\DBAL\Connection;
19+
use Doctrine\ORM\Configuration;
1920
use Doctrine\ORM\EntityManagerInterface;
2021
use Doctrine\ORM\Mapping\MappingException as ORMMappingException;
22+
use Doctrine\ORM\Mapping\NamingStrategy;
2123
use Doctrine\ORM\Tools\DisconnectedClassMetadataFactory;
2224
use Doctrine\Persistence\ManagerRegistry;
2325
use Doctrine\Persistence\Mapping\AbstractClassMetadataFactory;
@@ -221,16 +223,21 @@ private function isInstanceOf($object, string $class): bool
221223
return $object instanceof $class || $object instanceof $legacyClass;
222224
}
223225

224-
public function escapeTableNameIfNeeded(string $tableName): string
226+
public function getPotentialTableName(string $className): string
225227
{
226-
if (!$this->isKeyword($tableName)) {
227-
return $tableName;
228+
$entityManager = $this->registry->getManager();
229+
230+
if (!$entityManager instanceof EntityManagerInterface) {
231+
throw new \RuntimeException('ObjectManager is not an EntityManagerInterface.');
228232
}
229233

230-
return sprintf('`%s`', $tableName);
234+
/** @var NamingStrategy $namingStrategy */
235+
$namingStrategy = $entityManager->getConfiguration()->getNamingStrategy();
236+
237+
return $namingStrategy->classToTableName($className);
231238
}
232239

233-
private function isKeyword(string $name): bool
240+
public function isKeyword(string $name): bool
234241
{
235242
/** @var Connection $connection */
236243
$connection = $this->getRegistry()->getConnection();

src/Doctrine/EntityClassGenerator.php

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,12 @@
2222
final class EntityClassGenerator
2323
{
2424
private $generator;
25+
private $doctrineHelper;
2526

26-
public function __construct(Generator $generator)
27+
public function __construct(Generator $generator, DoctrineHelper $doctrineHelper)
2728
{
2829
$this->generator = $generator;
30+
$this->doctrineHelper = $doctrineHelper;
2931
}
3032

3133
public function generateEntityClass(ClassNameDetails $entityClassDetails, bool $apiResource, bool $withPasswordUpgrade = false): string
@@ -36,12 +38,16 @@ public function generateEntityClass(ClassNameDetails $entityClassDetails, bool $
3638
'Repository'
3739
);
3840

41+
$tableName = $this->doctrineHelper->getPotentialTableName($entityClassDetails->getFullName());
42+
3943
$entityPath = $this->generator->generateClass(
4044
$entityClassDetails->getFullName(),
4145
'doctrine/Entity.tpl.php',
4246
[
4347
'repository_full_class_name' => $repoClassDetails->getFullName(),
4448
'api_resource' => $apiResource,
49+
'should_escape_table_name' => $this->doctrineHelper->isKeyword($tableName),
50+
'table_name' => $tableName,
4551
]
4652
);
4753

src/Maker/MakeEntity.php

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

138138
$classExists = class_exists($entityClassDetails->getFullName());
139139
if (!$classExists) {
140-
$entityClassGenerator = new EntityClassGenerator($generator);
140+
$entityClassGenerator = new EntityClassGenerator($generator, $this->doctrineHelper);
141141
$entityPath = $entityClassGenerator->generateEntityClass(
142142
$entityClassDetails,
143143
$input->getOption('api-resource')

src/Maker/MakeUser.php

Lines changed: 3 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -102,15 +102,6 @@ class_exists(DoctrineBundle::class)
102102
if ($missingPackagesMessage) {
103103
throw new RuntimeCommandException($missingPackagesMessage);
104104
}
105-
106-
$question = 'Enter the entity\'s table name. (<comment>It will be auto-escaped.</comment>)';
107-
$entityTableName = $io->ask(
108-
$question, 'user', function ($name) {
109-
return Validator::validateDoctrineTableName($name, $this->doctrineHelper->getRegistry());
110-
});
111-
112-
$command->addOption('entity-table-name', $entityTableName);
113-
$input->setOption('entity-table-name', $entityTableName);
114105
}
115106
$input->setOption('is-entity', $userIsEntity);
116107

@@ -148,7 +139,7 @@ public function generate(InputInterface $input, ConsoleStyle $io, Generator $gen
148139

149140
// A) Generate the User class
150141
if ($userClassConfiguration->isEntity()) {
151-
$entityClassGenerator = new EntityClassGenerator($generator);
142+
$entityClassGenerator = new EntityClassGenerator($generator, $this->doctrineHelper);
152143
$classPath = $entityClassGenerator->generateEntityClass(
153144
$userClassNameDetails,
154145
false, // api resource
@@ -171,19 +162,9 @@ public function generate(InputInterface $input, ConsoleStyle $io, Generator $gen
171162
$userClassConfiguration
172163
);
173164

174-
// C) Add @ORM\Table annotation
175-
if ($userClassConfiguration->isEntity()) {
176-
$manipulator->addAnnotationToClass(
177-
'ORM\\Table',
178-
[
179-
'name' => $this->doctrineHelper->escapeTableNameIfNeeded($input->getOption('entity-table-name'))
180-
]
181-
);
182-
}
183-
184165
$generator->dumpFile($classPath, $manipulator->getSourceCode());
185166

186-
// D) Generate a custom user provider, if necessary
167+
// C) Generate a custom user provider, if necessary
187168
if (!$userClassConfiguration->isEntity()) {
188169
$userClassConfiguration->setUserProviderClass($generator->getRootNamespace().'\\Security\\UserProvider');
189170
$customProviderPath = $generator->generateClass(
@@ -195,7 +176,7 @@ public function generate(InputInterface $input, ConsoleStyle $io, Generator $gen
195176
);
196177
}
197178

198-
// E) Update security.yaml
179+
// D) Update security.yaml
199180
$securityYamlUpdated = false;
200181
$path = 'config/packages/security.yaml';
201182
if ($this->fileManager->fileExists($path)) {

src/Resources/skeleton/doctrine/Entity.tpl.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
<?php if ($api_resource): ?> * @ApiResource()
1111
<?php endif ?>
1212
* @ORM\Entity(repositoryClass="<?= $repository_full_class_name ?>")
13+
<?php if ($should_escape_table_name): ?> * @ORM\Table(name="`<?= $table_name ?>`")
14+
<?php endif ?>
1315
*/
1416
class <?= $class_name."\n" ?>
1517
{

src/Util/ClassSourceManipulator.php

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -718,12 +718,6 @@ public function addUseStatementIfNecessary(string $class): string
718718
// everywhere and do not add another use statement
719719
return '\\'.$class;
720720
}
721-
722-
// we're dealing with a "directory" namespace (ie: Assert, ORM)
723-
// we should use entire given class as alias
724-
if (0 === strpos($class, $alias)) {
725-
return $class;
726-
}
727721
}
728722

729723
// if $class is alphabetically before this use statement, place it before

src/Validator.php

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
namespace Symfony\Bundle\MakerBundle;
1313

1414
use Doctrine\Common\Persistence\ManagerRegistry;
15-
use Doctrine\DBAL\Connection;
1615
use Symfony\Bundle\MakerBundle\Exception\RuntimeCommandException;
1716
use Symfony\Component\Security\Core\User\UserInterface;
1817

@@ -168,21 +167,6 @@ public static function validateDoctrineFieldName(string $name, ManagerRegistry $
168167
return $name;
169168
}
170169

171-
public static function validateDoctrineTableName(string $name, ManagerRegistry $registry)
172-
{
173-
/** @var Connection $connection */
174-
$connection = $registry->getConnection();
175-
if ($connection->getSchemaManager()->tablesExist($name)) {
176-
throw new \InvalidArgumentException(sprintf('Table "%s" already exists.', $name));
177-
}
178-
179-
if (!preg_match('/^([0-9a-zA-Z_$])+$/', $name)) {
180-
throw new \InvalidArgumentException(sprintf('"%s" is not a valid table name.', $name));
181-
}
182-
183-
return $name;
184-
}
185-
186170
public static function existsOrNull(string $className = null, array $entities = [])
187171
{
188172
if (null !== $className) {

tests/Maker/MakeUserTest.php

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ public function getTestDetails()
2525
// user class name
2626
'User',
2727
'y', // entity
28-
'user', // table name
2928
'email', // identity property
3029
'y', // with password
3130
'y', // argon

tests/Util/ClassSourceManipulatorTest.php

Lines changed: 0 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -725,35 +725,6 @@ class Foo
725725
class Foo
726726
{
727727
}
728-
EOF
729-
];
730-
731-
yield 'directory_namespace' => [
732-
<<<EOF
733-
<?php
734-
735-
namespace Acme;
736-
737-
use Bar;
738-
739-
class Foo
740-
{
741-
}
742-
EOF
743-
,
744-
<<<EOF
745-
<?php
746-
747-
namespace Acme;
748-
749-
use Bar;
750-
751-
/**
752-
* @Bar\SomeAnnotation(message="Foo")
753-
*/
754-
class Foo
755-
{
756-
}
757728
EOF
758729
];
759730
}

0 commit comments

Comments
 (0)