diff --git a/features/configuration/autodiscovering_application_kernel.feature b/features/configuration/autodiscovering_application_kernel.feature new file mode 100644 index 0000000..30cb9eb --- /dev/null +++ b/features/configuration/autodiscovering_application_kernel.feature @@ -0,0 +1,214 @@ +Feature: Autodiscovering the application kernel + + Background: + Given a standard Symfony autoloader configured + And a feature file containing: + """ + Feature: + Scenario: + Then the passed service should be an instance of "\Psr\Container\ContainerInterface" + """ + And a Behat configuration containing: + """ + default: + extensions: + FriendsOfBehat\SymfonyExtension: ~ + + suites: + default: + contexts: + - App\Tests\SomeContext + """ + And a context file "tests/SomeContext.php" containing: + """ + service = $service; } + + /** @Then the passed service should be an instance of :expected */ + public function serviceShouldBe(string $expected): void + { + assert(is_object($this->service)); + assert($this->service instanceof $expected); + } + } + """ + And a services file "config/services.yaml" containing: + """ + services: + App\Tests\SomeContext: + public: true + arguments: + - "@service_container" + """ + + Scenario: Autodiscovering kernel in Symfony 3 directory structure application + Given a kernel file "src/Kernel.php" containing: + """ + loadFromExtension('framework', [ + 'test' => $this->getEnvironment() === 'test', + 'secret' => 'Pigeon', + ]); + + $loader->load(__DIR__ . '/../config/services.yaml'); + } + + protected function configureRoutes(RouteCollectionBuilder $routes): void {} + } + """ + When I run Behat + Then it should pass + + Scenario: Autodiscovering kernel in Symfony 4 directory structure application + Given a kernel file "app/AppKernel.php" containing: + """ + loadFromExtension('framework', [ + 'test' => $this->getEnvironment() === 'test', + 'secret' => 'Pigeon', + ]); + + $loader->load(__DIR__ . '/../config/services.yaml'); + } + + protected function configureRoutes(RouteCollectionBuilder $routes): void {} + } + """ + When I run Behat + Then it should pass + + Scenario: Failing to autodiscover the kernel + When I run Behat + Then it should fail with "Could not autodiscover the application kernel" + + Scenario: Failing to autodiscover the kernel + Given a kernel file "src/Kernel.php" containing: + """ + loadFromExtension('framework', [ + 'test' => $this->getEnvironment() === 'test', + 'secret' => 'Pigeon', + ]); + + $loader->load(__DIR__ . '/../config/services.yaml'); + } + + protected function configureRoutes(RouteCollectionBuilder $routes): void {} + } + """ + And a kernel file "app/AppKernel.php" containing: + """ + loadFromExtension('framework', [ + 'test' => $this->getEnvironment() === 'test', + 'secret' => 'Pigeon', + ]); + + $loader->load(__DIR__ . '/../config/services.yaml'); + } + + protected function configureRoutes(RouteCollectionBuilder $routes): void {} + } + """ + When I run Behat + Then it should fail with "Could not autodiscover the application kernel" diff --git a/features/configuration/loading_kernel_based_on_configurtion.feature b/features/configuration/loading_configured_application_kernel.feature similarity index 99% rename from features/configuration/loading_kernel_based_on_configurtion.feature rename to features/configuration/loading_configured_application_kernel.feature index 8efc077..69f0e02 100644 --- a/features/configuration/loading_kernel_based_on_configurtion.feature +++ b/features/configuration/loading_configured_application_kernel.feature @@ -1,4 +1,4 @@ -Feature: Loading kernel based on configuration +Feature: Loading configured application kernel Background: Given a standard Symfony autoloader configured diff --git a/src/ServiceContainer/SymfonyExtension.php b/src/ServiceContainer/SymfonyExtension.php index bc6140b..b96a5bb 100644 --- a/src/ServiceContainer/SymfonyExtension.php +++ b/src/ServiceContainer/SymfonyExtension.php @@ -56,7 +56,7 @@ final class SymfonyExtension implements Extension ->addDefaultsIfNotSet() ->children() ->scalarNode('path')->defaultNull()->end() - ->scalarNode('class')->isRequired()->end() + ->scalarNode('class')->defaultNull()->end() ->end() ->end() ->end() @@ -65,7 +65,7 @@ final class SymfonyExtension implements Extension public function load(ContainerBuilder $container, array $config): void { - $this->loadKernel($container, $config['kernel']); + $this->loadKernel($container, $this->processKernelConfiguration($config['kernel'])); $this->loadDriverKernel($container); $this->loadKernelRebooter($container); @@ -154,4 +154,35 @@ final class SymfonyExtension implements Extension $container->setDefinition('fob_symfony.mink.parameters', $minkParametersDefinition); } + + private function processKernelConfiguration(array $config): array + { + if ($config['class'] !== null) { + return $config; + } + + $autoconfigured = 0; + + if (class_exists('\App\Kernel')) { + $config['class'] = '\App\Kernel'; + + ++$autoconfigured; + } + + if (file_exists('app/AppKernel.php')) { + $config['class'] = '\AppKernel'; + $config['path'] = 'app/AppKernel.php'; + + ++$autoconfigured; + } + + if ($autoconfigured !== 1) { + throw new \RuntimeException( + 'Could not autodiscover the application kernel. ' . + 'Please define it manually with "FriendsOfBehat\SymfonyExtension.kernel" configuration option.' + ); + } + + return $config; + } }