Symfony6:Set/update/manipulate 环境变量 (APP_ENV) 和 PHP (bootstrap.php)
Symfony6: Set/update/manipulate environment variables (APP_ENV) with PHP (bootstrap.php)
我们正在将 Symfony5 应用程序重新设计为 Symfony6。我们有一个特殊情况,其中环境 APP_ENV 取决于应用程序的 hostname。
通过 app1.domain.com 和 app2.domain.com 访问同一个应用应该设置 APP_ENV symfony 变量 prod1 或 prod2.
这曾经发生在 config/bootstrap.php(Symfony4 的遗迹),但这在 Symfony6 中不再可用。
在 Symfony 开始处理请求之前注入一些代码以切换变量的最佳更新保存位置在哪里?
bootstrap.php 中的旧部分看起来像这样:
if(isset($_SERVER['HTTP_HOST'])) {
if(preg_match('#^app1\.domain\.com$#',$_SERVER['HTTP_HOST'])) {
$_SERVER['APP_ENV'] = "prod1"; $_ENV['env_name'] = "prod1";
$_ENV['env_name'] = "production_client1";
} elseif(preg_match('#^app2\.domain\.com$#',$_SERVER['HTTP_HOST'])) {
$_SERVER['APP_ENV'] = "prod2"; $_ENV['env_name'] = "prod2";
$_ENV['env_name'] = "production_client2";
} elseif(preg_match('#^app\.dev\.local$#',$_SERVER['HTTP_HOST'])) {
$_SERVER['APP_ENV'] = "dev"; $_ENV['env_name'] = "dev";
$_ENV['env_name'] = "development";
} else {
die("invalid domain");
}
}
根据环境,应用内会发生进一步的切换。
以下方法 do/did 无效:
- 无法在服务器(共享主机)上设置环境变量
- 通过 .htaccess 设置它不起作用,因为 mod_rewrite 将 REDIRECT_ 添加到所有环境变量
- subscribers/listeners 仅在请求事件 (kernel.request) 时附加,为时已晚
- 在.env中设置为静态
- 设置在.env.local.php不是更新保存,因为这个文件是生成的
- 运行将文件作为导入资源 (imports) 在 config.yaml 中也不会似乎有效
这个问题明确是关于切换环境的,不一定是关于解决方法!一个很好的额外功能是相同的代码可以 运行 在服务器上的开发环境中,只需通过本地开发域访问它。
我们采用的解决方案是将切换代码放入 config/ 中的包含文件中,然后直接从 index.php[= 加载它15=] 在加载 autoload_runtime.php 之前和创建内核之前。感谢@Cerad 向我们保证这可能没问题。
我们正在将 Symfony5 应用程序重新设计为 Symfony6。我们有一个特殊情况,其中环境 APP_ENV 取决于应用程序的 hostname。
通过 app1.domain.com 和 app2.domain.com 访问同一个应用应该设置 APP_ENV symfony 变量 prod1 或 prod2.
这曾经发生在 config/bootstrap.php(Symfony4 的遗迹),但这在 Symfony6 中不再可用。
在 Symfony 开始处理请求之前注入一些代码以切换变量的最佳更新保存位置在哪里?
bootstrap.php 中的旧部分看起来像这样:
if(isset($_SERVER['HTTP_HOST'])) {
if(preg_match('#^app1\.domain\.com$#',$_SERVER['HTTP_HOST'])) {
$_SERVER['APP_ENV'] = "prod1"; $_ENV['env_name'] = "prod1";
$_ENV['env_name'] = "production_client1";
} elseif(preg_match('#^app2\.domain\.com$#',$_SERVER['HTTP_HOST'])) {
$_SERVER['APP_ENV'] = "prod2"; $_ENV['env_name'] = "prod2";
$_ENV['env_name'] = "production_client2";
} elseif(preg_match('#^app\.dev\.local$#',$_SERVER['HTTP_HOST'])) {
$_SERVER['APP_ENV'] = "dev"; $_ENV['env_name'] = "dev";
$_ENV['env_name'] = "development";
} else {
die("invalid domain");
}
}
根据环境,应用内会发生进一步的切换。
以下方法 do/did 无效:
- 无法在服务器(共享主机)上设置环境变量
- 通过 .htaccess 设置它不起作用,因为 mod_rewrite 将 REDIRECT_ 添加到所有环境变量
- subscribers/listeners 仅在请求事件 (kernel.request) 时附加,为时已晚
- 在.env中设置为静态
- 设置在.env.local.php不是更新保存,因为这个文件是生成的
- 运行将文件作为导入资源 (imports) 在 config.yaml 中也不会似乎有效
这个问题明确是关于切换环境的,不一定是关于解决方法!一个很好的额外功能是相同的代码可以 运行 在服务器上的开发环境中,只需通过本地开发域访问它。
我们采用的解决方案是将切换代码放入 config/ 中的包含文件中,然后直接从 index.php[= 加载它15=] 在加载 autoload_runtime.php 之前和创建内核之前。感谢@Cerad 向我们保证这可能没问题。