Symfony 4控制台命令不读取环境变量

Posted

技术标签:

【中文标题】Symfony 4控制台命令不读取环境变量【英文标题】:Symfony 4 Console Command not reading env vars 【发布时间】:2019-12-17 07:32:30 【问题描述】:

我有一个小的控制台命令,我想在其中读取一些环境变量,但它似乎没有从 .env 文件或控制台中的服务器配置中读取变量(php 文件有效)

代码

protected function execute(InputInterface $input, OutputInterface $output)

    $io = new SymfonyStyle($input, $output);
    $debug = $input->getArgument('debug') === 'y' ? true : false;
    $this->project = $input->getArgument('project');

    $start = new DateTime();

    $debug ? $io->text('<fg=green>Starting upload</>') : null;
    dump(getenv('APP_ENV'));
    dump(getenv('MAILER_USERNAME'));
    die;
    ...

要测试的命令

php bin/console app:make-backup

输出:

Starting upload
false
false

php bin/console app:make-backup --env=prod

输出:

Starting upload
"prod"
false

php bin/console app:make-backup --env=dev

输出:

Starting upload
"dev"
false

.env 文件

APP_ENV=dev
MAILER_USERNAME=info@xxx.com

我看不出我在哪里做错了? nginx 和 apache 服务器上存在问题,但在任何 php 文件中使用 getenv('MAILER_USERNAME') 都有效。

【问题讨论】:

【参考方案1】:

我认为您最好的选择是继续注入环境变量。尝试直接访问它们可能有点棘手。

# config/services.yaml
services:
    App\Command\MyCommand:
        $appEnv:         '%env(APP_ENV)%'
        $mailerUsername: '%env(MAILER_USERNAME)%'

# src\Command\MyCommand
class MyCommand extends Command 
    protected static $defaultName = 'app:mine';

    private $appEnv;
    private $mailerUsername;

    public function __construct($appEnv,$mailerUsername) 
        parent::__construct();
        $this->appEnv = $appEnv;
        $this->mailerUsername = $mailerUsername;
    
    protected function execute(InputInterface $input, OutputInterface $output) 
        $output->writeln(("My Command " . $this->appEnv . " " . $this->mailerUsername));
    

【讨论】:

它说Cannot autowire service "App\Command\MyCommand": argument "$appEnv" of method "__construct()" is type-hinted "string", you should configure its value explicitly. 删除类型提示会引发类似的异常 查看我回答的第一部分。您需要 config/services.yaml 中的条目 我做了,我把它改成了***.com/a/53099308/1092632,但没有用...... 休息一下。然后回来查看您的代码。我发布的作品。你在某个地方有一个简单的错误。 :) 虽然我同意这一点,但这是可行的:***.com/a/54902115/1092632(具有默认值的第二部分)。我可能有点太累了。既然我同意你的代码应该可以工作,我还是接受你的回答并说谢谢

以上是关于Symfony 4控制台命令不读取环境变量的主要内容,如果未能解决你的问题,请参考以下文章

Symfony3 不读取 Elastic Beanstalk 上的环境变量

Grails 4:不读取 Elastic Beanstalk 中的环境变量

在 symfony2 parameters.yml 中获取环境变量

管道符和作业控制shell变量环境变量配置文件

2018-1-11 5周4次课 管道符作业控制shell变量环境变量配置

Laravel 使用 env 读取环境变量为 null 的问题