最近我決定在其中一個專案中使用 Symfony 5.4 容器來提供一些全面的 DI。它像往常一樣運行良好,直到我嘗試在services.yaml::parameters部分中使用一些環境變數。
檔案宣告要系結到 env var 我應該
# services.yaml
parameters:
my_var: '%env(SOME_ENV_VAR)%'
它將在第一次呼叫時從環境變數中解決。好的。我這樣做了,我得到了:
echo $container->getParameter('my_var');
// env_b057c2b619f37f36_SOME_ENV_VAR_222ed306d0932595cbdeada438ccbb2a
我確實看到SOME_ENV_VAR了$_SERVER和$_ENV。我還嘗試Dotenv了組件以確保我沒有遺漏任何東西,但徒勞無功。任何環境變數都會變成這種 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;
uj5u.com熱心網友回復:
根據您更新的代碼段,您需要使用:
$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";
uj5u.com熱心網友回復:
的簽名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;
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/421046.html
標籤:
