diff --git a/bin/doctrine b/bin/doctrine index a27a1bc8..56d0bbc6 100644 --- a/bin/doctrine +++ b/bin/doctrine @@ -3,22 +3,25 @@ declare(strict_types=1); +use Core\App\Event\TablePrefixEventListener; use Doctrine\ORM\EntityManager; +use Doctrine\ORM\Events; use Doctrine\ORM\Tools\Console\ConsoleRunner; use Doctrine\ORM\Tools\Console\EntityManagerProvider\SingleManagerProvider; +use Dot\DataFixtures\Command\ExecuteFixturesCommand; +use Dot\DataFixtures\Command\ListFixturesCommand; require_once 'vendor/autoload.php'; -$container = require getcwd() . '/config/container.php' ; +$container = require 'config/container.php'; $entityManager = $container->get(EntityManager::class); +$entityManager->getEventManager() + ->addEventListener(Events::loadClassMetadata, $container->get(TablePrefixEventListener::class)); $commands = [ - $container->get(Dot\DataFixtures\Command\ExecuteFixturesCommand::class), - $container->get(Dot\DataFixtures\Command\ListFixturesCommand::class), + $container->get(ExecuteFixturesCommand::class), + $container->get(ListFixturesCommand::class), ]; -ConsoleRunner::run( - new SingleManagerProvider($entityManager), - $commands -); +ConsoleRunner::run(new SingleManagerProvider($entityManager), $commands); diff --git a/config/autoload/local.php.dist b/config/autoload/local.php.dist index d08c545a..d9e05ffd 100644 --- a/config/autoload/local.php.dist +++ b/config/autoload/local.php.dist @@ -13,16 +13,17 @@ $baseUrl = 'http://localhost:8080'; $databases = [ 'default' => [ - 'host' => 'localhost', - 'dbname' => 'dotkernel', - 'user' => '', - 'password' => '', - 'port' => 3306, - 'driver' => 'pdo_mysql', - 'charset' => 'utf8mb4', - 'collate' => 'utf8mb4_general_ci', + 'host' => 'localhost', + 'dbname' => 'dotkernel', + 'user' => '', + 'password' => '', + 'port' => 3306, + 'driver' => 'pdo_mysql', + 'charset' => 'utf8mb4', + 'collate' => 'utf8mb4_general_ci', + 'table_prefix' => '', ], - // you can add more database connections into this array + // you can add more database connections to this array ]; return [ diff --git a/config/cli-config.php b/config/cli-config.php index 202c2fd9..2a5bcc2a 100644 --- a/config/cli-config.php +++ b/config/cli-config.php @@ -2,18 +2,20 @@ declare(strict_types=1); +use Core\App\Event\TablePrefixEventListener; use Doctrine\Migrations\Configuration\EntityManager\ExistingEntityManager; use Doctrine\Migrations\Configuration\Migration\ConfigurationArray; use Doctrine\Migrations\DependencyFactory; use Doctrine\ORM\EntityManager; +use Doctrine\ORM\Events; -$container = require __DIR__ . '/container.php'; +$container = require 'config/container.php'; + +$entityManager = $container->get(EntityManager::class); +$entityManager->getEventManager() + ->addEventListener(Events::loadClassMetadata, $container->get(TablePrefixEventListener::class)); return DependencyFactory::fromEntityManager( - new ConfigurationArray( - $container->get('config')['doctrine']['migrations'] - ), - new ExistingEntityManager( - $container->get(EntityManager::class) - ) + new ConfigurationArray($container->get('config')['doctrine']['migrations']), + new ExistingEntityManager($entityManager) ); diff --git a/log/.gitignore b/log/.gitignore old mode 100644 new mode 100755 diff --git a/src/Core/src/App/src/ConfigProvider.php b/src/Core/src/App/src/ConfigProvider.php index 7b1e445b..918ac03b 100644 --- a/src/Core/src/App/src/ConfigProvider.php +++ b/src/Core/src/App/src/ConfigProvider.php @@ -7,7 +7,9 @@ use Core\App\Command\RouteListCommand; use Core\App\DBAL\Types\SuccessFailureEnumType; use Core\App\DBAL\Types\YesNoEnumType; +use Core\App\Event\TablePrefixEventListener; use Core\App\Factory\EntityListenerResolverFactory; +use Core\App\Factory\TablePrefixDelegatorFactory; use Core\App\Resolver\EntityListenerResolver; use Core\App\Service\MailService; use Doctrine\ORM\EntityManager; @@ -23,6 +25,7 @@ use Dot\Mail\Factory\MailOptionsAbstractFactory; use Dot\Mail\Factory\MailServiceAbstractFactory; use Dot\Mail\Service\MailService as DotMailService; +use Mezzio\Application; use Ramsey\Uuid\Doctrine\UuidBinaryOrderedTimeType; use Ramsey\Uuid\Doctrine\UuidBinaryType; use Ramsey\Uuid\Doctrine\UuidType; @@ -117,15 +120,19 @@ public function __invoke(): array private function getDependencies(): array { return [ - 'factories' => [ + 'delegators' => [ + Application::class => [TablePrefixDelegatorFactory::class], + ], + 'factories' => [ 'doctrine.entity_manager.orm_default' => EntityManagerFactory::class, 'dot-mail.options.default' => MailOptionsAbstractFactory::class, 'dot-mail.service.default' => MailServiceAbstractFactory::class, EntityListenerResolver::class => EntityListenerResolverFactory::class, MailService::class => AttributedServiceFactory::class, RouteListCommand::class => AttributedServiceFactory::class, + TablePrefixEventListener::class => AttributedServiceFactory::class, ], - 'aliases' => [ + 'aliases' => [ DotMailService::class => 'dot-mail.service.default', EntityManager::class => 'doctrine.entity_manager.orm_default', EntityManagerInterface::class => 'doctrine.entity_manager.orm_default', diff --git a/src/Core/src/App/src/Event/TablePrefixEventListener.php b/src/Core/src/App/src/Event/TablePrefixEventListener.php new file mode 100644 index 00000000..68b5d2a2 --- /dev/null +++ b/src/Core/src/App/src/Event/TablePrefixEventListener.php @@ -0,0 +1,54 @@ + $config + */ + #[Inject( + 'config.doctrine.connection.orm_default.params', + )] + public function __construct(array $config) + { + if (array_key_exists('table_prefix', $config) && is_string($config['table_prefix'])) { + $this->prefix = $config['table_prefix']; + } + } + + public function loadClassMetadata(LoadClassMetadataEventArgs $eventArgs): void + { + if ($this->prefix === '') { + return; + } + + $classMetadata = $eventArgs->getClassMetadata(); + if ( + ! $classMetadata->isInheritanceTypeSingleTable() + || $classMetadata->getName() === $classMetadata->rootEntityName + ) { + $classMetadata->setPrimaryTable([ + 'name' => $this->prefix . $classMetadata->getTableName(), + ]); + } + + foreach ($classMetadata->getAssociationMappings() as $fieldName => $mapping) { + if ($mapping['type'] === ClassMetadata::MANY_TO_MANY && $mapping['isOwningSide']) { + $classMetadata->associationMappings[$fieldName]['joinTable']['name'] = + $this->prefix . $mapping['joinTable']['name']; + } + } + } +} diff --git a/src/Core/src/App/src/Factory/TablePrefixDelegatorFactory.php b/src/Core/src/App/src/Factory/TablePrefixDelegatorFactory.php new file mode 100644 index 00000000..057fef98 --- /dev/null +++ b/src/Core/src/App/src/Factory/TablePrefixDelegatorFactory.php @@ -0,0 +1,34 @@ +has('doctrine.entity_manager.orm_default')) { + /** @var EntityManagerInterface $entityManager */ + $entityManager = $container->get('doctrine.entity_manager.orm_default'); + $entityManager->getEventManager()->addEventListener( + Events::loadClassMetadata, + $container->get(TablePrefixEventListener::class) + ); + } + + return $callback(); + } +}