Symfony 4,从控制器获取 .env 参数,这可能吗?如何?

Symfony 4, get .env parameter from a controller, is it possible and how?

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

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

您尝试过:

$this->getParameter('your parameter');

编辑:

这可能对你有帮助 -> https://symfony.com/doc/current/components/dotenv.html

在使用 getParameter() 之前,您必须在 services.yaml

中添加它
parameters:
    your_parameter: '%env(your_parameter)%' # from .env file

如果有人仍在寻找快速解决方案但没有太多 symfonish,

在 .env 中定义您的参数

MY_PARAM='my param value'

然后在控制器中调用它

echo $_ENV['MY_PARAM'];

如果您在控制器中调用变量,您最好在 parameters 部分下的 config/services.yaml 中定义它,并通过 parameterBag 访问它是一种非常合乎情理的方式。

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

对于 Symfony 5

在您的 .env 文件中

APP_PARAM=paramvaluehere

在你的config/services.yaml

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

在你的控制器中

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

是的。您有 03 个步骤配置:
首先 - 在 env 中声明您的变量。
其次 - 配置服务文件
最后 - 在你的控制器中调用你的参数:

_ 在从 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;
        // ...
    }
}


_ 最后,如果某些控制器需要访问大量参数,而不是单独注入每个参数,您可以通过 type-hinting 它的任何构造函数一次注入所有应用程序参数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');
        // ...
    }
}


来源 Accessing Configuration Parameters

在 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') }}