Symfony 4,从控制器获取.env参数,是否可能?如何实现?

35

从Symfony 4开始,我想创建一个全局参数,并从控制器中获取此参数的值。

这个参数是服务器上另一个应用程序的路径。因此,我考虑在.env文件中添加参数。但是,如何从控制器中获取此参数的值呢?

7个回答

58

Symfony 5的情况下

在你的.env文件中

APP_PARAM=paramvaluehere

在你的config/services.yaml文件中

parameters:
    app.paramname: '%env(APP_PARAM)%'

在你的控制器中

$this->getParameter('app.paramname');

1
也适用于4.3。 - learner
3
你可以在.env文件中仅使用值来执行$_SERVER['APP_PARAM']。https://symfony.com/doc/current/cloud/cookbooks/env.html#accessing-environment-variables - TikTaZ
1
要能够调用$this->getParameter('app.paramname'),请确保您的控制器extends AbstractController - iloo
如果您的控制器不是extends AbstractController,则只有config/services.yaml部分是必需的。 https://symfony.com/doc/current/configuration.html#accessing-configuration-parameters - Jibato

39

如果有人仍在寻找一个快速但不太symfonish的解决方案,

请在.env文件中定义您的参数。

MY_PARAM='my param value'

然后在控制器中调用它

echo $_ENV['MY_PARAM'];

如果你在控制器中调用变量,最好在config/services.yaml文件的parameters部分定义它,并通过parameterBag访问它,这是一种更具Symfony风格的方式。


1
我相信这是从Symfony 4.3+升级的默认方式!目前正在使用5.2版本。 - Artandor
1
随着时间的推移,你会忘记基础知识。$_ENV 可以胜任一些简单的任务,例如功能测试 :) 对于更加复杂和符合 Symfony 的方法,请使用参数。 - davidmpaz

15

1
谢谢您的回答 :) 我在.env文件中添加了参数foo(foo = faa),我清除了缓存,但是在我的控制器中出现“InvalidArgumentException:必须定义参数'foo'”。 :/ - spacecodeur
1
修改了我的答案。 - AnTrakS
1
是的,我刚看到了!很奇怪,我以为那是Symfony中的本地方法! - spacecodeur
我对Symfony不是很熟悉,Symfony 4 中可能有一种本地方法。 - AnTrakS

11

在使用 getParameter() 之前,您需要将以下内容添加到 services.yaml 中。

parameters:
    your_parameter: '%env(your_parameter)%' # from .env file

8

是的,它就是。您需要进行三个步骤的配置:
首先,在环境变量中声明您的变量。
其次,在配置服务文件。
最后,在控制器中调用您的参数:

_ 在扩展自AbstractController的控制器中,使用getParameter()助手:

YAML文件配置

# config/services.yaml
parameters:
    kernel.project_dir: "%env(variable_name)%"
    app.admin_email: "%env(variable_name)%"

在你的控制器中,
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;

class UserController extends AbstractController
{
    // ...

    public function index(): Response
    {
        $projectDir = $this->getParameter('kernel.project_dir');
        $adminEmail = $this->getParameter('app.admin_email');

        // ...
    }
}


如果控制器没有继承自AbstractController,则将参数作为它们构造函数的参数进行注入。

YAML文件配置

# config/services.yaml
parameters:
    app.contents_dir: "%env(variable_name)%"

services:
    App\Controllers\UserController :
        arguments:
            $contentsDir: '%app.contents_dir%'

在您的控制器中,

class UserController 
{
    private $params;

    public function __construct(string $contentsDir)
    {
        $this->params = $contentsDir;
    }

    public function someMethod()
    {
        $parameterValue = $this->params;
        // ...
    }
}


_ 最后,如果某些控制器需要访问大量参数,而不是逐个注入每个参数,您可以通过对 ContainerBagInterface 的任何构造函数参数进行类型提示一次性注入所有应用程序参数:

YAML 文件配置

# config/services.yaml
parameters:
    app.parameter_name: "%env(variable_name)%"

为您服务,

use Symfony\Component\DependencyInjection\ParameterBag\ContainerBagInterface;

class UserController 
{
    private $params;

    public function __construct(ContainerBagInterface $params)
    {
        $this->params = $params;
    }

    public function someMethod()
    {
        $parameterValue = $this->params->get('app.parameter_name');
        // ...
    }
}


来源 访问配置参数


根据@samuel-liew的建议进行更正。 - belem

6
  1. 在配置参数中添加变量:
    parameters:
        your_variable: '%env(YOUR_ENV_VARIABLE)%'
  1. 从控制器获取它
    $var = $this->getParameter('your_variable');

3
在Symfony 4.4中,这个功能可以正常工作:
<?php
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;

class SomeController extends AbstractController 
{

    public function someMethod(Request $request)
    {
        $parameterValue = $request->server->get('env_varname');
        // ...
    }
}

同样适用于TWIG:

{{ app.request.server.get('env_varname') }}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接