diff --git a/.docs/README.md b/.docs/README.md index e89f489..71bfb39 100755 --- a/.docs/README.md +++ b/.docs/README.md @@ -145,6 +145,10 @@ nettrine.orm: entityListenerResolver: repositoryFactory: defaultQueryHints: + filters: + : + class: + enabled: entityManagerDecoratorClass: configurationClass: diff --git a/src/DI/OrmExtension.php b/src/DI/OrmExtension.php index 25f89bc..967d6db 100644 --- a/src/DI/OrmExtension.php +++ b/src/DI/OrmExtension.php @@ -50,6 +50,12 @@ public function getConfigSchema(): Schema 'entityListenerResolver' => Expect::string(), 'repositoryFactory' => Expect::string(), 'defaultQueryHints' => Expect::array(), + 'filters' => Expect::arrayOf( + Expect::structure([ + 'class' => Expect::string()->required(), + 'enabled' => Expect::bool(false), + ]) + ), ]), ]); } @@ -141,6 +147,12 @@ public function loadDoctrineConfiguration(): void if ($config->defaultQueryHints !== []) { $configuration->addSetup('setDefaultQueryHints', [$config->defaultQueryHints]); } + + if ($config->filters !== []) { + foreach ($config->filters as $filterName => $filter) { + $configuration->addSetup('addFilter', [$filterName, $filter->class]); + } + } } public function loadEntityManagerConfiguration(): void @@ -161,9 +173,17 @@ public function loadEntityManagerConfiguration(): void ]); // Entity Manager Decorator - $builder->addDefinition($this->prefix('entityManagerDecorator')) + $decorator = $builder->addDefinition($this->prefix('entityManagerDecorator')) ->setFactory($entityManagerDecoratorClass, [$original]); + if ($config->configuration->filters !== []) { + foreach ($config->configuration->filters as $filterName => $filter) { + if ($filter->enabled) { + $decorator->addSetup(new Statement('$service->getFilters()->enable(?)', [$filterName])); + } + } + } + // ManagerRegistry $builder->addDefinition($this->prefix('managerRegistry')) ->setType(ManagerRegistry::class) diff --git a/tests/cases/DI/OrmExtensionTest.php b/tests/cases/DI/OrmExtensionTest.php index ae8b7bf..9105fa9 100644 --- a/tests/cases/DI/OrmExtensionTest.php +++ b/tests/cases/DI/OrmExtensionTest.php @@ -8,6 +8,7 @@ use stdClass; use Tests\Fixtures\DummyConfiguration; use Tests\Fixtures\DummyEntityManagerDecorator; +use Tests\Fixtures\DummyFilter; use Tests\Toolkit\Nette\ContainerBuilder; use Tests\Toolkit\TestCase; @@ -41,6 +42,39 @@ public function testCustomEntityManager(): void $this->assertInstanceOf(DummyConfiguration::class, $container->getByType(DummyConfiguration::class)); } + public function testFilters(): void + { + $container = ContainerBuilder::of() + ->withDefaults() + ->withCompiler(static function (Compiler $compiler): void { + $compiler->addConfig([ + 'nettrine.orm' => [ + 'configuration' => [ + 'filters' => [ + 'autoEnabledFilter' => [ + 'class' => DummyFilter::class, + 'enabled' => true, + ], + 'autoDisabledFilter' => [ + 'class' => DummyFilter::class, + ], + ], + ], + ], + ]); + }) + ->build(); + /** @var EntityManagerDecorator $em */ + $em = $container->getService('nettrine.orm.entityManagerDecorator'); + $filters = $em->getFilters(); + + $this->assertEquals(true, $filters->has('autoEnabledFilter')); + $this->assertEquals(true, $filters->isEnabled('autoEnabledFilter')); + + $this->assertEquals(true, $filters->has('autoDisabledFilter')); + $this->assertEquals(false, $filters->isEnabled('autoDisabledFilter')); + } + public function testConfigurationException(): void { $this->expectException(InvalidArgumentException::class); diff --git a/tests/fixtures/DummyFilter.php b/tests/fixtures/DummyFilter.php new file mode 100644 index 0000000..e12c7ba --- /dev/null +++ b/tests/fixtures/DummyFilter.php @@ -0,0 +1,19 @@ +