Skip to content

[FrameworkBundle] Define APP_ENV/APP_DEBUG from argv via Application::bootstrapEnv() #29154

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Nov 10, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 23 additions & 4 deletions UPGRADE-4.2.md
Original file line number Diff line number Diff line change
Expand Up @@ -175,10 +175,29 @@ FrameworkBundle
```
* The `ContainerAwareCommand` class has been deprecated, use `Symfony\Component\Console\Command\Command`
with dependency injection instead.
* The `--env` console option and its "-e" shortcut have been deprecated,
set the "APP_ENV" environment variable instead.
* The `--no-debug` console option has been deprecated,
set the "APP_DEBUG" environment variable to "0" instead.
* The `--env` and `--no-debug` console options have been deprecated, define the `APP_ENV` and
`APP_DEBUG` environment variables instead.
If you want to keep using `--env` and `--no-debug`, update your `bin/console` file to make it call
`Application::bootstrapEnv()`.

Before:
```php
$input = new ArgvInput();
$env = $input->getParameterOption(['--env', '-e'], $_SERVER['APP_ENV'] ?? 'dev', true);
$debug = (bool) ($_SERVER['APP_DEBUG'] ?? ('prod' !== $env)) && !$input->hasParameterOption('--no-debug', true);
$kernel = new Kernel($env, $debug);
$application = new Application($kernel);
$application->run($input);
```

After:
```php
Application::bootstrapEnv($_SERVER['argv'];
$kernel = new Kernel($_SERVER['APP_ENV'], $_SERVER['APP_DEBUG']);
$application = new Application($kernel);
$application->run();
```

* The `Templating\Helper\TranslatorHelper::transChoice()` method has been deprecated, use the `trans()` one instead with a `%count%` parameter.
* Deprecated support for legacy translations directories `src/Resources/translations/` and `src/Resources/<BundleName>/translations/`, use `translations/` instead.
* Support for the legacy directory structure in `translation:update` and `debug:translation` commands has been deprecated.
Expand Down
27 changes: 23 additions & 4 deletions UPGRADE-5.0.md
Original file line number Diff line number Diff line change
Expand Up @@ -164,10 +164,29 @@ FrameworkBundle
* Added support for the SameSite attribute for session cookies. It is highly recommended to set this setting (`framework.session.cookie_samesite`) to `lax` for increased security against CSRF attacks.
* The `ContainerAwareCommand` class has been removed, use `Symfony\Component\Console\Command\Command`
with dependency injection instead.
* The `--env` console option and its "-e" shortcut have been removed,
set the "APP_ENV" environment variable instead.
* The `--no-debug` console option has been removed,
set the "APP_DEBUG" environment variable to "0" instead.
* The `--env` and `--no-debug` console options have been removed, define the `APP_ENV` and
`APP_DEBUG` environment variables instead.
If you want to keep using `--env` and `--no-debug`, update your `bin/console` file to make it call
`Application::bootstrapEnv()`.

Before:
```php
$input = new ArgvInput();
$env = $input->getParameterOption(['--env', '-e'], $_SERVER['APP_ENV'] ?? 'dev', true);
$debug = (bool) ($_SERVER['APP_DEBUG'] ?? ('prod' !== $env)) && !$input->hasParameterOption('--no-debug', true);
$kernel = new Kernel($env, $debug);
$application = new Application($kernel);
$application->run($input);
```

After:
```php
Application::bootstrapEnv($_SERVER['argv'];
$kernel = new Kernel($_SERVER['APP_ENV'], $_SERVER['APP_DEBUG']);
$application = new Application($kernel);
$application->run();
```

* The `Templating\Helper\TranslatorHelper::transChoice()` method has been removed, use the `trans()` one instead with a `%count%` parameter.
* Removed support for legacy translations directories `src/Resources/translations/` and `src/Resources/<BundleName>/translations/`, use `translations/` instead.
* Support for the legacy directory structure in `translation:update` and `debug:translation` commands has been removed.
Expand Down
8 changes: 4 additions & 4 deletions src/Symfony/Bundle/FrameworkBundle/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,10 @@ CHANGELOG
* Removed the `framework.messenger.encoder` and `framework.messenger.decoder` options. Use the `framework.messenger.serializer.id` option to replace the Messenger serializer.
* Deprecated the `ContainerAwareCommand` class in favor of `Symfony\Component\Console\Command\Command`
* Made `debug:container` and `debug:autowiring` ignore backslashes in service ids
* Deprecated the `--env` console option and its "-e" shortcut, set
the "APP_ENV" environment variable instead.
* Deprecated the `--no-debug` console option, set the "APP_DEBUG"
environment variable to "0" instead.
* Deprecated the `--env` console option and its "-e" shortcut, set the "APP_ENV" environment variable
or use `Application::bootstrapEnv()` instead.
* Deprecated the `--no-debug` console option, set the "APP_DEBUG" environment variable to "0"
or use `Application::bootstrapEnv()` instead.
* Deprecated the `Templating\Helper\TranslatorHelper::transChoice()` method, use the `trans()` one instead with a `%count%` parameter
* Deprecated `CacheCollectorPass`. Use `Symfony\Component\Cache\DependencyInjection\CacheCollectorPass` instead.
* Deprecated `CachePoolClearerPass`. Use `Symfony\Component\Cache\DependencyInjection\CachePoolClearerPass` instead.
Expand Down
29 changes: 29 additions & 0 deletions src/Symfony/Bundle/FrameworkBundle/Console/Application.php
Original file line number Diff line number Diff line change
Expand Up @@ -207,6 +207,35 @@ protected function registerCommands()
}
}

/**
* Defines the "APP_ENV" and "APP_DEBUG" environment variables by consuming --env and --no-debug from the command line arguments.
*/
public static function bootstrapEnv(array &$argv)
{
for ($i = 0; $i < \count($argv) && '--' !== $v = $argv[$i]; ++$i) {
if ('--no-debug' === $v) {
putenv('APP_DEBUG='.$_SERVER['APP_DEBUG'] = $_ENV['APP_DEBUG'] = '0');
$argvUnset[$i] = true;
break;
}
}

for ($i = 0; $i < \count($argv) && '--' !== $v = $argv[$i]; ++$i) {
if (!$v || '-' !== $v[0] || !preg_match('/^-(?:-env(?:=|$)|e=?)(.*)$/D', $v, $v)) {
continue;
}
if (!empty($v[1]) || !empty($argv[1 + $i])) {
putenv('APP_ENV='.$_SERVER['APP_ENV'] = $_ENV['APP_ENV'] = empty($v[1]) ? $argv[1 + $i] : $v[1]);
$argvUnset[$i] = $argvUnset[$i + empty($v[1])] = true;
}
break;
}

if (!empty($argvUnset)) {
$argv = array_values(array_diff_key($argv, $argvUnset));
}
}

private function renderRegistrationErrors(InputInterface $input, OutputInterface $output)
{
if ($output instanceof ConsoleOutputInterface) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -283,6 +283,63 @@ private function createBundleMock(array $commands)

return $bundle;
}

public function testBootstrapEnv()
{
$argv = array('--no-debug', '--env=testBootstrapEnv', 'foo=bar');
Application::bootstrapEnv($argv);

$this->assertSame($_SERVER['APP_DEBUG'], '0');
$this->assertSame($_ENV['APP_DEBUG'], '0');
$this->assertSame('0', getenv('APP_DEBUG'));
$this->assertSame('testBootstrapEnv', $_SERVER['APP_ENV']);
$this->assertSame('testBootstrapEnv', $_ENV['APP_ENV']);
$this->assertSame('testBootstrapEnv', getenv('APP_ENV'));
$this->assertSame(array('foo=bar'), $argv);

unset($_SERVER['APP_ENV']);
unset($_ENV['APP_ENV']);
putenv('APP_ENV');
unset($_SERVER['APP_DEBUG']);
unset($_ENV['APP_DEBUG']);
putenv('APP_DEBUG');

$argv = array('--env', 'testBootstrapEnv', 'foo=bar');
Application::bootstrapEnv($argv);

$this->assertSame('testBootstrapEnv', $_SERVER['APP_ENV']);
$this->assertSame('testBootstrapEnv', $_ENV['APP_ENV']);
$this->assertSame('testBootstrapEnv', getenv('APP_ENV'));
$this->assertSame(array('foo=bar'), $argv);

unset($_SERVER['APP_ENV']);
unset($_ENV['APP_ENV']);
putenv('APP_ENV');

$argv = array('-e', 'testBootstrapEnv', 'foo=bar');
Application::bootstrapEnv($argv);

$this->assertSame('testBootstrapEnv', $_SERVER['APP_ENV']);
$this->assertSame('testBootstrapEnv', $_ENV['APP_ENV']);
$this->assertSame('testBootstrapEnv', getenv('APP_ENV'));
$this->assertSame(array('foo=bar'), $argv);

unset($_SERVER['APP_ENV']);
unset($_ENV['APP_ENV']);
putenv('APP_ENV');

$argv = array('-e=testBootstrapEnv', 'foo=bar');
Application::bootstrapEnv($argv);

$this->assertSame('testBootstrapEnv', $_SERVER['APP_ENV']);
$this->assertSame('testBootstrapEnv', $_ENV['APP_ENV']);
$this->assertSame('testBootstrapEnv', getenv('APP_ENV'));
$this->assertSame(array('foo=bar'), $argv);

unset($_SERVER['APP_ENV']);
unset($_ENV['APP_ENV']);
putenv('APP_ENV');
}
}

class ThrowingCommand extends Command
Expand Down