147 lines
5.1 KiB
PHP
147 lines
5.1 KiB
PHP
<?php
|
|
|
|
/*
|
|
* This file is part of the Symfony MakerBundle package.
|
|
*
|
|
* (c) Fabien Potencier <fabien@symfony.com>
|
|
*
|
|
* For the full copyright and license information, please view the LICENSE
|
|
* file that was distributed with this source code.
|
|
*/
|
|
|
|
namespace Symfony\Bundle\MakerBundle\Doctrine;
|
|
|
|
use ApiPlatform\Metadata\ApiResource;
|
|
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
|
|
use Doctrine\Persistence\ManagerRegistry;
|
|
use Symfony\Bridge\Doctrine\Types\UlidType;
|
|
use Symfony\Bridge\Doctrine\Types\UuidType;
|
|
use Symfony\Bundle\MakerBundle\Generator;
|
|
use Symfony\Bundle\MakerBundle\Maker\Common\EntityIdTypeEnum;
|
|
use Symfony\Bundle\MakerBundle\Str;
|
|
use Symfony\Bundle\MakerBundle\Util\ClassNameDetails;
|
|
use Symfony\Bundle\MakerBundle\Util\UseStatementGenerator;
|
|
use Symfony\Component\Security\Core\Exception\UnsupportedUserException;
|
|
use Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface;
|
|
use Symfony\Component\Security\Core\User\PasswordUpgraderInterface;
|
|
use Symfony\Component\Security\Core\User\UserInterface;
|
|
use Symfony\Component\Uid\Ulid;
|
|
use Symfony\Component\Uid\Uuid;
|
|
use Symfony\UX\Turbo\Attribute\Broadcast;
|
|
|
|
/**
|
|
* @internal
|
|
*/
|
|
final class EntityClassGenerator
|
|
{
|
|
public function __construct(
|
|
private Generator $generator,
|
|
private DoctrineHelper $doctrineHelper,
|
|
) {
|
|
}
|
|
|
|
public function generateEntityClass(ClassNameDetails $entityClassDetails, bool $apiResource, bool $withPasswordUpgrade = false, bool $generateRepositoryClass = true, bool $broadcast = false, EntityIdTypeEnum $useUuidIdentifier = EntityIdTypeEnum::INT): string
|
|
{
|
|
$repoClassDetails = $this->generator->createClassNameDetails(
|
|
$entityClassDetails->getRelativeName(),
|
|
'Repository\\',
|
|
'Repository'
|
|
);
|
|
|
|
$tableName = $this->doctrineHelper->getPotentialTableName($entityClassDetails->getFullName());
|
|
|
|
$useStatements = new UseStatementGenerator([
|
|
$repoClassDetails->getFullName(),
|
|
['Doctrine\\ORM\\Mapping' => 'ORM'],
|
|
]);
|
|
|
|
if ($broadcast) {
|
|
$useStatements->addUseStatement(Broadcast::class);
|
|
}
|
|
|
|
if ($apiResource) {
|
|
$useStatements->addUseStatement(ApiResource::class);
|
|
}
|
|
|
|
if (EntityIdTypeEnum::UUID === $useUuidIdentifier) {
|
|
$useStatements->addUseStatement([
|
|
Uuid::class,
|
|
UuidType::class,
|
|
]);
|
|
}
|
|
|
|
if (EntityIdTypeEnum::ULID === $useUuidIdentifier) {
|
|
$useStatements->addUseStatement([
|
|
Ulid::class,
|
|
UlidType::class,
|
|
]);
|
|
}
|
|
|
|
$entityPath = $this->generator->generateClass(
|
|
$entityClassDetails->getFullName(),
|
|
'doctrine/Entity.tpl.php',
|
|
[
|
|
'use_statements' => $useStatements,
|
|
'repository_class_name' => $repoClassDetails->getShortName(),
|
|
'api_resource' => $apiResource,
|
|
'broadcast' => $broadcast,
|
|
'should_escape_table_name' => $this->doctrineHelper->isKeyword($tableName),
|
|
'table_name' => $tableName,
|
|
'id_type' => $useUuidIdentifier,
|
|
]
|
|
);
|
|
|
|
if ($generateRepositoryClass) {
|
|
$this->generateRepositoryClass(
|
|
$repoClassDetails->getFullName(),
|
|
$entityClassDetails->getFullName(),
|
|
$withPasswordUpgrade,
|
|
true
|
|
);
|
|
}
|
|
|
|
return $entityPath;
|
|
}
|
|
|
|
public function generateRepositoryClass(string $repositoryClass, string $entityClass, bool $withPasswordUpgrade, bool $includeExampleComments = true): void
|
|
{
|
|
$shortEntityClass = Str::getShortClassName($entityClass);
|
|
$entityAlias = strtolower($shortEntityClass[0]);
|
|
|
|
$passwordUserInterfaceName = UserInterface::class;
|
|
|
|
if (interface_exists(PasswordAuthenticatedUserInterface::class)) {
|
|
$passwordUserInterfaceName = PasswordAuthenticatedUserInterface::class;
|
|
}
|
|
|
|
$interfaceClassNameDetails = new ClassNameDetails($passwordUserInterfaceName, 'Symfony\Component\Security\Core\User');
|
|
|
|
$useStatements = new UseStatementGenerator([
|
|
$entityClass,
|
|
ManagerRegistry::class,
|
|
ServiceEntityRepository::class,
|
|
]);
|
|
|
|
if ($withPasswordUpgrade) {
|
|
$useStatements->addUseStatement([
|
|
$interfaceClassNameDetails->getFullName(),
|
|
PasswordUpgraderInterface::class,
|
|
UnsupportedUserException::class,
|
|
]);
|
|
}
|
|
|
|
$this->generator->generateClass(
|
|
$repositoryClass,
|
|
'doctrine/Repository.tpl.php',
|
|
[
|
|
'use_statements' => $useStatements,
|
|
'entity_class_name' => $shortEntityClass,
|
|
'entity_alias' => $entityAlias,
|
|
'with_password_upgrade' => $withPasswordUpgrade,
|
|
'password_upgrade_user_interface' => $interfaceClassNameDetails,
|
|
'include_example_comments' => $includeExampleComments,
|
|
]
|
|
);
|
|
}
|
|
}
|