* * 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: 'Compile .env files to .env.local.php')] final class DotenvDumpCommand extends Command { public function __construct( private string $projectDir, private ?string $defaultEnv = null, ) { parent::__construct(); } protected function configure(): void { $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 %command.name% command compiles .env files into a PHP-optimized file called .env.local.php. %command.full_name% EOT ) ; } 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 = <<writeln(sprintf('Successfully dumped .env files in .env.local.php for the %s environment.', $env)); return 0; } private function loadEnv(string $dotenvPath, string $env, array $config): array { $envKey = $config['env_var_name'] ?? 'APP_ENV'; $testEnvs = $config['test_envs'] ?? ['test']; $dotenv = new Dotenv($envKey); $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']); unset($_ENV['SYMFONY_DOTENV_PATH']); return $_ENV; } finally { [$_SERVER, $_ENV] = $globalsBackup; } } }