/src/Symfony/Component/Dotenv/Command/DotenvDumpCommand.php
https://github.com/stof/symfony · PHP · 122 lines · 79 code · 21 blank · 22 comment · 3 complexity · fdf843326b55385465a41227d0e4bcdb MD5 · raw file
- <?php
- /*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Symfony\Component\Dotenv\Command;
- use Symfony\Component\Console\Attribute\AsCommand;
- use Symfony\Component\Console\Command\Command;
- use Symfony\Component\Console\Input\InputArgument;
- use Symfony\Component\Console\Input\InputInterface;
- use Symfony\Component\Console\Input\InputOption;
- use Symfony\Component\Console\Output\OutputInterface;
- use Symfony\Component\DependencyInjection\Attribute\Autoconfigure;
- use Symfony\Component\Dotenv\Dotenv;
- /**
- * A console command to compile .env files into a PHP-optimized file called .env.local.php.
- *
- * @internal
- */
- #[Autoconfigure(bind: ['$projectDir' => '%kernel.project_dir%', '$defaultEnv' => '%kernel.environment%'])]
- #[AsCommand(name: 'dotenv:dump', description: 'Compiles .env files to .env.local.php')]
- final class DotenvDumpCommand extends Command
- {
- private string $projectDir;
- private string|null $defaultEnv;
- public function __construct(string $projectDir, string $defaultEnv = null)
- {
- $this->projectDir = $projectDir;
- $this->defaultEnv = $defaultEnv;
- parent::__construct();
- }
- /**
- * {@inheritdoc}
- */
- protected function configure()
- {
- $this
- ->setDefinition([
- new InputArgument('env', null === $this->defaultEnv ? InputArgument::REQUIRED : InputArgument::OPTIONAL, 'The application environment to dump .env files for - e.g. "prod".'),
- ])
- ->addOption('empty', null, InputOption::VALUE_NONE, 'Ignore the content of .env files')
- ->setHelp(<<<'EOT'
- The <info>%command.name%</info> command compiles .env files into a PHP-optimized file called .env.local.php.
- <info>%command.full_name%</info>
- EOT
- )
- ;
- }
- /**
- * {@inheritdoc}
- */
- protected function execute(InputInterface $input, OutputInterface $output): int
- {
- $config = [];
- if (is_file($projectDir = $this->projectDir)) {
- $config = ['dotenv_path' => basename($projectDir)];
- $projectDir = \dirname($projectDir);
- }
- $composerFile = $projectDir.'/composer.json';
- $config += (is_file($composerFile) ? json_decode(file_get_contents($composerFile), true) : [])['extra']['runtime'] ?? [];
- $dotenvPath = $projectDir.'/'.($config['dotenv_path'] ?? '.env');
- $env = $input->getArgument('env') ?? $this->defaultEnv;
- $envKey = $config['env_var_name'] ?? 'APP_ENV';
- if ($input->getOption('empty')) {
- $vars = [$envKey => $env];
- } else {
- $vars = $this->loadEnv($dotenvPath, $env, $config);
- $env = $vars[$envKey];
- }
- $vars = var_export($vars, true);
- $vars = <<<EOF
- <?php
- // This file was generated by running "php bin/console dotenv:dump $env"
- return $vars;
- EOF;
- file_put_contents($dotenvPath.'.local.php', $vars, \LOCK_EX);
- $output->writeln(sprintf('Successfully dumped .env files in <info>.env.local.php</> for the <info>%s</> environment.', $env));
- return 0;
- }
- private function loadEnv(string $dotenvPath, string $env, array $config): array
- {
- $dotenv = new Dotenv();
- $envKey = $config['env_var_name'] ?? 'APP_ENV';
- $testEnvs = $config['test_envs'] ?? ['test'];
- $globalsBackup = [$_SERVER, $_ENV];
- unset($_SERVER[$envKey]);
- $_ENV = [$envKey => $env];
- $_SERVER['SYMFONY_DOTENV_VARS'] = implode(',', array_keys($_SERVER));
- try {
- $dotenv->loadEnv($dotenvPath, null, 'dev', $testEnvs);
- unset($_ENV['SYMFONY_DOTENV_VARS']);
- return $_ENV;
- } finally {
- [$_SERVER, $_ENV] = $globalsBackup;
- }
- }
- }