diff --git a/.travis.yml b/.travis.yml index e937fc1..3ae989d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -18,6 +18,7 @@ before_install: install: - composer require symfony/http-kernel:${SYMFONY_VERSION} --no-update --no-scripts --prefer-dist + - composer require symfony/dotenv:${SYMFONY_VERSION} --no-update --no-scripts --prefer-dist - composer require --dev symfony/framework-bundle:${SYMFONY_VERSION} --no-update --no-scripts --prefer-dist - composer update --prefer-dist diff --git a/README.md b/README.md index 740fd17..0e705e6 100644 --- a/README.md +++ b/README.md @@ -27,4 +27,29 @@ ensures that application behaviour will not be affected by stateful services. FriendsOfBehat\SymfonyExtension: ~ ``` +**Symfony 3 configuration** + +``` +FriendsOfBehat\SymfonyExtension: + kernel: + bootstrap: 'var/bootstrap.php.cache' + path: app/AppKernel.php + class: 'AppKernel' + env: test + debug: true +``` + +**Symfony 4 configuration** + +``` +FriendsOfBehat\SymfonyExtension: + env_file: .env + kernel: + class: 'MyTrip\Kernel' + path: src/Kernel.php + debug: true +``` + +Symfony 4 does not have bootstrap file anymore and the environment is configured in the .env file. + 3. Good luck & have fun! diff --git a/composer.json b/composer.json index 2152b6f..d6784c0 100644 --- a/composer.json +++ b/composer.json @@ -13,7 +13,8 @@ "php": "^7.1", "behat/behat": "^3.1", - "symfony/http-kernel": "^3.3|^4.0" + "symfony/http-kernel": "^3.3|^4.0", + "symfony/dotenv": "^3.3|^4.0" }, "require-dev": { "behat/mink": "^1.7", diff --git a/features/not_crashing_behat.feature b/features/not_crashing_behat.feature index a973f8d..7fc7f9b 100644 --- a/features/not_crashing_behat.feature +++ b/features/not_crashing_behat.feature @@ -56,3 +56,36 @@ Feature: Not crashing Behat And a feature file with passing scenario When I run Behat Then it should pass + + Scenario: This extension boot a Symfony4 kernel + Given a Behat configuration containing: + """ + default: + extensions: + FriendsOfBehat\SymfonyExtension: + env_file: .env_in_memory + kernel: + path: src/MyKernel.php + class: MyKernel + bootstrap: ~ + """ + And a file ".env_in_memory" containing: + """ + APP_ENV=dev + """ + And a file "src/MyKernel.php" containing: + """ + addDefaultsIfNotSet() ->children() + ->scalarNode('env_file')->defaultNull()->end() ->arrayNode('kernel') ->addDefaultsIfNotSet() ->children() @@ -110,6 +122,16 @@ final class SymfonyExtension implements Extension */ public function load(ContainerBuilder $container, array $config): void { + if (null !== $config['env_file']) { + $this->loadEnvVars($container, $config['env_file']); + + $environment = false !== getenv('APP_ENV') ? getenv('APP_ENV') : self::DEFAULT_ENV; + $debugMode = false !== getenv('APP_DEBUG') ? getenv('APP_DEBUG') : self::DEBUG_MODE; + + $config['kernel']['env'] = $environment; + $config['kernel']['kernel'] = $debugMode; + } + $this->loadKernel($container, $config['kernel']); $this->loadKernelContainer($container); @@ -129,6 +151,16 @@ final class SymfonyExtension implements Extension { } + /** + * @param ContainerBuilder $container + * @param string $fileName + */ + private function loadEnvVars(ContainerBuilder $container, string $fileName): void + { + $envFilePath = sprintf('%s/%s', $container->getParameter('paths.base'), $fileName); + (new Dotenv())->load($envFilePath); + } + /** * @param ContainerBuilder $container */ @@ -203,6 +235,8 @@ final class SymfonyExtension implements Extension /** * @param ContainerBuilder $container + * + * @throws \Exception */ private function declareSymfonyContainers(ContainerBuilder $container): void {