diff --git a/bin/doctrine b/bin/doctrine index feb3080d..27428699 100644 --- a/bin/doctrine +++ b/bin/doctrine @@ -3,6 +3,8 @@ declare(strict_types=1); +use Core\App\Event\TablePrefixEventListener; +use Doctrine\ORM\Events; use Doctrine\ORM\Tools\Console\ConsoleRunner; use Doctrine\ORM\Tools\Console\EntityManagerProvider\SingleManagerProvider; use Dot\DataFixtures\Command\ExecuteFixturesCommand; @@ -14,6 +16,8 @@ require_once 'vendor/autoload.php'; $container = require 'config/container.php' ; $entityManager = $container->get(EntityManager::class); +$entityManager->getEventManager() + ->addEventListener(Events::loadClassMetadata, $container->get(TablePrefixEventListener::class)); $commands = [ $container->get(ExecuteFixturesCommand::class), diff --git a/composer.json b/composer.json index 00ec47ad..9d587b2f 100644 --- a/composer.json +++ b/composer.json @@ -85,7 +85,6 @@ "dotkernel/dot-maker": "^1.0.2", "laminas/laminas-coding-standard": "^3.0.1", "laminas/laminas-development-mode": "^3.13.0", - "mezzio/mezzio-tooling": "^2.10.1", "phpstan/phpstan": "^2.1.11", "phpstan/phpstan-doctrine": "^2.0.2", "phpstan/phpstan-phpunit": "^2.0.6", diff --git a/config/autoload/local.php.dist b/config/autoload/local.php.dist index e7bad732..3a261a3f 100644 --- a/config/autoload/local.php.dist +++ b/config/autoload/local.php.dist @@ -6,14 +6,15 @@ $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 to this array ]; diff --git a/config/cli-config.php b/config/cli-config.php index 80dee1af..2a5bcc2a 100644 --- a/config/cli-config.php +++ b/config/cli-config.php @@ -2,16 +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 '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 ExistingEntityManager($entityManager) ); diff --git a/config/config.php b/config/config.php index bdd220c2..8978e3ea 100644 --- a/config/config.php +++ b/config/config.php @@ -31,11 +31,6 @@ Mezzio\Helper\ConfigProvider::class, Mezzio\ConfigProvider::class, Mezzio\Router\ConfigProvider::class, - class_exists(Mezzio\Tooling\ConfigProvider::class) - ? Mezzio\Tooling\ConfigProvider::class - : function () { - return []; - }, // Include cache configuration new Laminas\ConfigAggregator\ArrayProvider($cacheConfig), 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(); + } +}