From 096f8755ba64101c2283ae80185659efdc9818d7 Mon Sep 17 00:00:00 2001 From: Andreas Penz Date: Tue, 8 Dec 2020 19:09:40 +0100 Subject: [PATCH 1/3] add the ability to define schema assets filter in configuration --- example/full-config.php | 1 + src/ConfigurationFactory.php | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/example/full-config.php b/example/full-config.php index 5d92843..b05593c 100644 --- a/example/full-config.php +++ b/example/full-config.php @@ -63,6 +63,7 @@ 'app.foo.middleware', // Will be looked up in the container. 'app.bar.middleware', // Will be looked up in the container. ], + 'schema_assets_filter' => null, ], ], 'connection' => [ diff --git a/src/ConfigurationFactory.php b/src/ConfigurationFactory.php index 9347029..706c851 100644 --- a/src/ConfigurationFactory.php +++ b/src/ConfigurationFactory.php @@ -135,6 +135,12 @@ protected function createWithConfig(ContainerInterface $container, string $confi $configuration->setEntityListenerResolver($config['entity_listener_resolver']); } + if (is_string($config['schema_assets_filter'])) { + $configuration->setSchemaAssetsFilter($container->get($config['schema_assets_filter'])); + } elseif (is_callable($config['schema_assets_filter'])) { + $configuration->setSchemaAssetsFilter($config['schema_assets_filter']); + } + if ($config['default_repository_class_name'] !== null) { $configuration->setDefaultRepositoryClassName($config['default_repository_class_name']); } From fde5c5e3544a6a931e87204b688d34e4fabf8208 Mon Sep 17 00:00:00 2001 From: Andreas Penz Date: Tue, 8 Dec 2020 20:23:03 +0100 Subject: [PATCH 2/3] do not accept closure as schema_assets_filter --- src/ConfigurationFactory.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ConfigurationFactory.php b/src/ConfigurationFactory.php index 706c851..a95be98 100644 --- a/src/ConfigurationFactory.php +++ b/src/ConfigurationFactory.php @@ -137,7 +137,7 @@ protected function createWithConfig(ContainerInterface $container, string $confi if (is_string($config['schema_assets_filter'])) { $configuration->setSchemaAssetsFilter($container->get($config['schema_assets_filter'])); - } elseif (is_callable($config['schema_assets_filter'])) { + } elseif ($config['schema_assets_filter'] !== null) { $configuration->setSchemaAssetsFilter($config['schema_assets_filter']); } From dae3ee1d00d2e5005f4aaaf3101f627a196acf29 Mon Sep 17 00:00:00 2001 From: Yevhen Vilkhovchenko Date: Mon, 6 Feb 2023 20:44:59 +0200 Subject: [PATCH 3/3] Avoid callable "schema_assets_filter" support 1. Fix 'Undefined array key "schema_assets_filter"' warning by add default config value --- example/full-config.php | 19 ++++++- src/ConfigurationFactory.php | 3 +- test/ConfigurationFactoryTest.php | 84 +++++++++++++++++++++++++++++++ 3 files changed, 103 insertions(+), 3 deletions(-) diff --git a/example/full-config.php b/example/full-config.php index b05593c..20f5517 100644 --- a/example/full-config.php +++ b/example/full-config.php @@ -16,6 +16,7 @@ use Doctrine\Common\Cache\XcacheCache; use Doctrine\Common\Cache\ZendDataCache; use Doctrine\DBAL\Driver\PDOMySql\Driver; +use Doctrine\DBAL\Schema\AbstractAsset; use Doctrine\Migrations\Configuration\Migration\ConfigurationLoader; use Doctrine\Migrations\DependencyFactory; use Doctrine\Migrations\Tools\Console\Command; @@ -63,7 +64,7 @@ 'app.foo.middleware', // Will be looked up in the container. 'app.bar.middleware', // Will be looked up in the container. ], - 'schema_assets_filter' => null, + 'schema_assets_filter' => 'my_schema_assets_filter', ], ], 'connection' => [ @@ -194,6 +195,22 @@ DependencyFactory::class => DependencyFactoryFactory::class, ConfigurationLoader::class => ConfigurationLoaderFactory::class, + + 'my_schema_assets_filter' => static function (): callable { + /** + * Filter out assets (table, sequence) by name from Schema + * because ones have no mapping and this cause unwanted create|drop statements in migration + * generated with migrations:diff command when compare ORM schema and schema introspected from database + */ + return static fn (AbstractAsset|string $asset): bool => ! in_array( + $asset instanceof AbstractAsset ? $asset->getName() : $asset, + [ + 'sequence_to_generate_value', + 'table_without_doctrine_mapping', + ], + true, + ); + }, ], ], ]; diff --git a/src/ConfigurationFactory.php b/src/ConfigurationFactory.php index a95be98..1be9026 100644 --- a/src/ConfigurationFactory.php +++ b/src/ConfigurationFactory.php @@ -137,8 +137,6 @@ protected function createWithConfig(ContainerInterface $container, string $confi if (is_string($config['schema_assets_filter'])) { $configuration->setSchemaAssetsFilter($container->get($config['schema_assets_filter'])); - } elseif ($config['schema_assets_filter'] !== null) { - $configuration->setSchemaAssetsFilter($config['schema_assets_filter']); } if ($config['default_repository_class_name'] !== null) { @@ -221,6 +219,7 @@ protected function getDefaultConfig(string $configKey): array 'repository_factory' => null, 'class_metadata_factory_name' => null, 'entity_listener_resolver' => null, + 'schema_assets_filter' => null, 'second_level_cache' => [ 'enabled' => false, 'default_lifetime' => 3600, diff --git a/test/ConfigurationFactoryTest.php b/test/ConfigurationFactoryTest.php index 0898cbc..84fd415 100644 --- a/test/ConfigurationFactoryTest.php +++ b/test/ConfigurationFactoryTest.php @@ -118,6 +118,90 @@ static function (string $id): bool { self::assertSame([$middlewareFoo, $middlewareBar], $configuration->getMiddlewares()); } + public function testWillSetSchemaAssetsFilterByContainerId(): void + { + $testFilter = static fn (): bool => true; + $config = [ + 'doctrine' => [ + 'configuration' => [ + 'orm_default' => ['schema_assets_filter' => 'testFilterContainerId'], + ], + ], + ]; + + $container = $this->createStub(ContainerInterface::class); + + $container + ->method('has') + ->willReturnCallback( + static fn (string $id) => in_array( + $id, + [ + 'config', + 'doctrine.driver.orm_default', + 'testFilterContainerId', + ], + true, + ), + ); + + $container + ->method('get') + ->willReturnMap( + [ + ['config', $config], + ['doctrine.driver.orm_default', $this->createStub(MappingDriver::class)], + ['testFilterContainerId', $testFilter], + ], + ); + + $configuration = (new ConfigurationFactory())($container); + + self::assertSame($testFilter, $configuration->getSchemaAssetsFilter()); + } + + public function testMistypeInSchemaAssetsFilterResolvedContainerId(): void + { + $testFilter = ['misconfig' => 'resolved service is not callable']; + $config = [ + 'doctrine' => [ + 'configuration' => [ + 'orm_default' => ['schema_assets_filter' => 'testFilterContainerId'], + ], + ], + ]; + + $container = $this->createStub(ContainerInterface::class); + + $container + ->method('has') + ->willReturnCallback( + static fn (string $id) => in_array( + $id, + [ + 'config', + 'doctrine.driver.orm_default', + 'testFilterContainerId', + ], + true, + ), + ); + + $container + ->method('get') + ->willReturnMap( + [ + ['config', $config], + ['doctrine.driver.orm_default', $this->createStub(MappingDriver::class)], + ['testFilterContainerId', $testFilter], + ], + ); + + self::expectError(); + + (new ConfigurationFactory())($container); + } + /** * @param non-empty-string $propertyName *