Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
bug #29154 [FrameworkBundle] Define APP_ENV/APP_DEBUG from argv via A…
…pplication::bootstrapEnv() (chalasr)

This PR was merged into the 4.2-dev branch.

Discussion
----------

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

| Q             | A
| ------------- | ---
| Branch?       | 4.2
| Bug fix?      | no
| New feature?  | yes
| BC breaks?    | no
| Deprecations? | no
| Tests pass?   | yes
| Fixed tickets | #28984, #29126
| License       | MIT
| Doc PR        | todo

Replaces #29126.

Commits
-------

bbd5682 [FrameworkBundle] Define APP_ENV/APP_DEBUG from argv via Application::bootstrapEnv()
  • Loading branch information
nicolas-grekas committed Nov 10, 2018
2 parents 664a032 + bbd5682 commit 9253199
Show file tree
Hide file tree
Showing 5 changed files with 136 additions and 12 deletions.
27 changes: 23 additions & 4 deletions UPGRADE-4.2.md
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
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
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
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
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

0 comments on commit 9253199

Please sign in to comment.