Skip to content

Commit a8536e4

Browse files
committed
bug #545 Make User: availability to chose table's name (nikophil)
This PR was squashed before being merged into the 1.0-dev branch (closes #545). Discussion ---------- Make User: availability to chose table's name Hello, this fixes #485 i may provide a fix for #473 in another PR Commits ------- 4b42eca check table name using naming strategy 966c355 MakeUser: availability to chose table's name
2 parents 3585a2f + 4b42eca commit a8536e4

File tree

7 files changed

+43
-4
lines changed

7 files changed

+43
-4
lines changed

src/Doctrine/DoctrineHelper.php

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,11 @@
1515
use Doctrine\Common\Persistence\Mapping\ClassMetadata as LegacyClassMetadata;
1616
use Doctrine\Common\Persistence\Mapping\Driver\MappingDriver as LegacyMappingDriver;
1717
use Doctrine\Common\Persistence\Mapping\MappingException as LegacyPersistenceMappingException;
18+
use Doctrine\DBAL\Connection;
19+
use Doctrine\ORM\Configuration;
1820
use Doctrine\ORM\EntityManagerInterface;
1921
use Doctrine\ORM\Mapping\MappingException as ORMMappingException;
22+
use Doctrine\ORM\Mapping\NamingStrategy;
2023
use Doctrine\ORM\Tools\DisconnectedClassMetadataFactory;
2124
use Doctrine\Persistence\ManagerRegistry;
2225
use Doctrine\Persistence\Mapping\AbstractClassMetadataFactory;
@@ -219,4 +222,26 @@ private function isInstanceOf($object, string $class): bool
219222

220223
return $object instanceof $class || $object instanceof $legacyClass;
221224
}
225+
226+
public function getPotentialTableName(string $className): string
227+
{
228+
$entityManager = $this->registry->getManager();
229+
230+
if (!$entityManager instanceof EntityManagerInterface) {
231+
throw new \RuntimeException('ObjectManager is not an EntityManagerInterface.');
232+
}
233+
234+
/** @var NamingStrategy $namingStrategy */
235+
$namingStrategy = $entityManager->getConfiguration()->getNamingStrategy();
236+
237+
return $namingStrategy->classToTableName($className);
238+
}
239+
240+
public function isKeyword(string $name): bool
241+
{
242+
/** @var Connection $connection */
243+
$connection = $this->getRegistry()->getConnection();
244+
245+
return $connection->getDatabasePlatform()->getReservedKeywordsList()->isKeyword($name);
246+
}
222247
}

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: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
use Doctrine\Bundle\DoctrineBundle\DoctrineBundle;
1515
use Symfony\Bundle\MakerBundle\ConsoleStyle;
1616
use Symfony\Bundle\MakerBundle\DependencyBuilder;
17+
use Symfony\Bundle\MakerBundle\Doctrine\DoctrineHelper;
1718
use Symfony\Bundle\MakerBundle\Doctrine\EntityClassGenerator;
1819
use Symfony\Bundle\MakerBundle\Doctrine\ORMDependencyBuilder;
1920
use Symfony\Bundle\MakerBundle\Exception\RuntimeCommandException;
@@ -49,11 +50,14 @@ final class MakeUser extends AbstractMaker
4950

5051
private $configUpdater;
5152

52-
public function __construct(FileManager $fileManager, UserClassBuilder $userClassBuilder, SecurityConfigUpdater $configUpdater)
53+
private $doctrineHelper;
54+
55+
public function __construct(FileManager $fileManager, UserClassBuilder $userClassBuilder, SecurityConfigUpdater $configUpdater, DoctrineHelper $doctrineHelper)
5356
{
5457
$this->fileManager = $fileManager;
5558
$this->userClassBuilder = $userClassBuilder;
5659
$this->configUpdater = $configUpdater;
60+
$this->doctrineHelper = $doctrineHelper;
5761
}
5862

5963
public static function getCommandName(): string
@@ -135,7 +139,7 @@ public function generate(InputInterface $input, ConsoleStyle $io, Generator $gen
135139

136140
// A) Generate the User class
137141
if ($userClassConfiguration->isEntity()) {
138-
$entityClassGenerator = new EntityClassGenerator($generator);
142+
$entityClassGenerator = new EntityClassGenerator($generator, $this->doctrineHelper);
139143
$classPath = $entityClassGenerator->generateEntityClass(
140144
$userClassNameDetails,
141145
false, // api resource
@@ -157,6 +161,7 @@ public function generate(InputInterface $input, ConsoleStyle $io, Generator $gen
157161
$manipulator,
158162
$userClassConfiguration
159163
);
164+
160165
$generator->dumpFile($classPath, $manipulator->getSourceCode());
161166

162167
// C) Generate a custom user provider, if necessary

src/Resources/config/makers.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@
9797
<argument type="service" id="maker.file_manager" />
9898
<argument type="service" id="maker.user_class_builder" />
9999
<argument type="service" id="maker.security_config_updater" />
100+
<argument type="service" id="maker.doctrine_helper" />
100101
<tag name="maker.command" />
101102
</service>
102103

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
{

tests/tmp/.gitignore

Whitespace-only changes.

0 commit comments

Comments
 (0)