我在这里遇到一堵砖墙。到目前为止,Symfony 4的所有功能都充满阳光和雏菊,但是现在我似乎无法在项目中添加任何环境变量。
在我的项目根目录中,有一个默认的.env
文件,其中填充了通常的APP_ENV
,APP_SECRET
和DATABASE_URL
;太好了。但是,在其中添加任何自定义变量似乎实际上并不会执行任何操作!例如,如果我添加了ANOTHER_VAR=hello_world
,然后运行bin/console debug:container --env-vars
,它只会转储APP_SECRET
和DATABASE_URL
变量。但是,如果我运行bin/console about
,它将显示.env
内的所有变量。
我认为这可能是缓存变量问题,但是如果我更改APP_SECRET
的值并再次运行console命令,它将转储更改后的值,但仍不是我的自定义变量。
我怀疑,默认情况下容器不提供env var,但是这对我来说似乎不合适(而且似乎与the Symfony docs自己说的有些矛盾)。
我需要做什么来注册这些变量,以便可以在Controller内部访问它们?
答案 0 :(得分:-1)
像我一样,在沮丧并寻求帮助的半小时内,我偶然发现了答案。
与documentation的读取方式相反,仅向.env
文件中添加变量并不能使其在Container中可用(因此在您运行bin/console debug:container --env-vars
时没有列出,也无法在容器中使用使用$this->getParameter('env(VAR)')
的控制器。现在考虑一下,这有点有意义,因为您不希望 all 所有受保护的变量都可用于从Container运行的所有内容。
要访问env var,您需要先对其进行参数化,这样您就可以限制对它的访问。
您可以在config/services.yaml
文件中设置所有希望用于所有服务的环境变量(如下所示)(假设启用了自动装配):
parameters:
variable_a: '%env(VAR_A)%'
如果您希望将env var限制为仅几个服务,则可以将其作为config/services.yaml
中的参数注入到服务中,如下所示:
services:
App\Service\Foo:
arguments:
$bar: '%env(BAZ)%'
使用如上所述的参数设置,现在我可以使用$this->getParameter('variable_a')
访问Controller内的env var了。运行bin/console debug:container --env-vars
也会输出它。
这有点痛苦,因为我认为只需调用$this->getParameter('env(BAZ)')
就能达到目的,但我想这是有道理的(实际上没有称为env(BAZ)
的参数)。
希望这可以帮助其他挣扎着解决这个问题的人。