From cd792704faaa05533a8375495b396128abe9e7cf Mon Sep 17 00:00:00 2001 From: Kamil Kokot Date: Tue, 12 Feb 2019 22:51:59 +0100 Subject: [PATCH] Add support for class resolvers --- composer.json | 1 + .../class_resolvers_compatibility.feature | 65 +++++++++++++++++++ .../ContextServiceEnvironmentHandler.php | 28 +++++++- src/ServiceContainer/SymfonyExtension.php | 4 ++ 4 files changed, 96 insertions(+), 2 deletions(-) create mode 100644 features/sanity_checks/class_resolvers_compatibility.feature diff --git a/composer.json b/composer.json index 4157b20..8883805 100644 --- a/composer.json +++ b/composer.json @@ -21,6 +21,7 @@ "behat/mink": "^1.7", "behat/mink-browserkit-driver": "^1.3", "behat/mink-extension": "^2.2", + "friends-of-behat/service-container-extension": "^1.0", "phpstan/phpstan-shim": "^0.11", "sylius-labs/coding-standard": "^3.0", "symfony/framework-bundle": "^3.4|^4.1", diff --git a/features/sanity_checks/class_resolvers_compatibility.feature b/features/sanity_checks/class_resolvers_compatibility.feature new file mode 100644 index 0000000..761c8b8 --- /dev/null +++ b/features/sanity_checks/class_resolvers_compatibility.feature @@ -0,0 +1,65 @@ +Feature: Class resolvers compatibility + + Scenario: Using class resolvers while handling context environment + Given a working Symfony application with SymfonyExtension configured + And a Behat configuration containing: + """ + default: + extensions: + FriendsOfBehat\ServiceContainerExtension: + imports: + - "tests/class_resolver.yml" + + suites: + default: + contexts: + - class:resolved:context + """ + And a Behat services definition file "tests/class_resolver.yml" containing: + """ + services: + App\Tests\CustomClassResolver: + tags: ["context.class_resolver"] + """ + And a Behat service implementation file "tests/CustomClassResolver.php" containing: + """ + symfonyKernel = $symfonyKernel; @@ -79,9 +83,14 @@ final class ContextServiceEnvironmentHandler implements EnvironmentHandler return $environment; } - public function registerContextInitializer(ContextInitializer $initializer): void + public function registerContextInitializer(ContextInitializer $contextInitializer): void { - $this->contextInitializers[] = $initializer; + $this->contextInitializers[] = $contextInitializer; + } + + public function registerClassResolver(ClassResolver $classResolver): void + { + $this->classResolvers[] = $classResolver; } /** @@ -125,8 +134,21 @@ final class ContextServiceEnvironmentHandler implements EnvironmentHandler } } + private function resolveContextId(string $contextId): string + { + foreach ($this->classResolvers as $resolver) { + if ($resolver->supportsClass($contextId)) { + return $resolver->resolveClass($contextId); + } + } + + return $contextId; + } + private function getContextClass(string $contextId): string { + $contextId = $this->resolveContextId($contextId); + if ($this->getContainer()->has($contextId)) { return get_class($this->getContainer()->get($contextId)); } @@ -142,6 +164,8 @@ final class ContextServiceEnvironmentHandler implements EnvironmentHandler private function getContext(string $contextId): Context { + $contextId = $this->resolveContextId($contextId); + $class = '\\' . ltrim($contextId, '\\'); if ($this->getContainer()->has($contextId)) { diff --git a/src/ServiceContainer/SymfonyExtension.php b/src/ServiceContainer/SymfonyExtension.php index fe20b2e..7810a0c 100644 --- a/src/ServiceContainer/SymfonyExtension.php +++ b/src/ServiceContainer/SymfonyExtension.php @@ -253,5 +253,9 @@ final class SymfonyExtension implements Extension foreach ($container->findTaggedServiceIds(ContextExtension::INITIALIZER_TAG) as $serviceId => $tags) { $definition->addMethodCall('registerContextInitializer', [$container->getDefinition($serviceId)]); } + + foreach ($container->findTaggedServiceIds(ContextExtension::CLASS_RESOLVER_TAG) as $serviceId => $tags) { + $definition->addMethodCall('registerClassResolver', [$container->getDefinition($serviceId)]); + } } }