簡體   English   中英

Symfony 5.4 服務中的環境變量。yaml::parameters

[英]Symfony 5.4 environmental variables in services.yaml::parameters

最近我決定在其中一個項目中使用 Symfony 5.4 容器來提供一些全面的 DI。 它像往常一樣運行良好,直到我嘗試在services.yaml::parameters部分中使用一些環境變量。

我應該綁定到環境變量的文檔 state

# services.yaml
parameters:
  my_var: '%env(SOME_ENV_VAR)%'

它將在第一次調用時從環境變量中解決。 好的。 我這樣做了,我得到了:

echo $container->getParameter('my_var');
// env_b057c2b619f37f36_SOME_ENV_VAR_222ed306d0932595cbdeada438ccbb2a

我確實在$_SERVER$_ENV中都看到SOME_ENV_VAR 我還嘗試Dotenv組件,以確保我沒有遺漏任何東西,但徒勞無功。 任何 env var 都會變成這種env_{hash}_{VAR_NAME}_{hash}模式。

我沒有使用完整的 Symfony 安裝,只是一些備用組件。 我錯過了什么? 我應該在容器構建階段手動填充每個環境變量嗎?


容器實例化如下:

// $_ENV and $_SERVER already contain `SOME_ENV_VAR` here

require_once __DIR__ . '/vendor/autoload.php';

// `use` statements go here

$containerBuilder = new ContainerBuilder();

$loader = new YamlFileLoader(
  $containerBuilder,
  new FileLocator(implode(DIRECTORY_SEPARATOR, [__DIR__, 'config']))
);

$loader->load('services.yaml');

$containerBuilder->compile();

$container = $containerBuilder;

$my_var = $container->getParameter('SOME_ENV_VAR');

echo $my_var;

根據您更新的代碼段,您需要使用:

$container->compile(true); // false is the default

該參數稱為resolveEnvPlaceholders。 我記得前段時間它抓住了我。

仍然覺得你設置了 $_ENV 有點令人費解,但我會相信你的話。

這是我挖出的一個舊測試用例,它仍然有效:

use Symfony\Component\DependencyInjection\ContainerBuilder;

class Service 
{
  public function __construct(string $dsn)
  {
    echo $dsn . "\n";
  }
}
$container = new ContainerBuilder();
$container->autowire(Service::class,Service::class)->setPublic(true)
    ->setArguments([
        '%env(DSN)%'
  ]);
$container->setParameter('my_var','%env(DSN)%');

putenv('DSN=dsn_value');
$container->compile(true);

$service = $container->get(Service::class);

echo $container->getParameter('my_var') . "\n";

ContainerBuilder::compile()的簽名是:

public function compile(bool $resolveEnvPlaceholders = false)

如果您不傳遞它true ,它將不會解析環境變量的占位符。

此外,您的示例存在問題。

您正在調用:

$my_var = $container->getParameter('SOME_ENV_VAR');

但是SOME_ENV_VAR不是容器參數,而是環境變量。 正確的調用是:

$my_var = $container->getParameter('my_var');

整個事情將是:

use Symfony\Component\Config\FileLocator;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;

require_once __DIR__ . '/vendor/autoload.php';

$containerBuilder = new ContainerBuilder();

$loader = new YamlFileLoader(
    $containerBuilder,
    new FileLocator(implode(DIRECTORY_SEPARATOR, [__DIR__, 'config']))
);

$loader->load(__DIR__ . '/services.yaml');

$containerBuilder->compile(true);

$container = $containerBuilder;
$my_var    = $container->getParameter('my_var');

echo $my_var;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM