如何在 laravel 中以编程方式即时设置 .env 值

新手上路,请多包涵

我有一个自定义 CMS,我在 Laravel 中从头开始编写,并希望在用户设置后从控制器设置 env 值,即数据库详细信息、邮件详细信息、一般配置等,并希望为用户提供灵活性使用我正在制作的 GUI 随时更改它们。

所以我的问题是,当我需要控制器时,如何将用户收到的值写入 .env 文件。

在旅途中构建 .env 文件是一个好主意,还是有其他解决方法?

提前致谢。

原文由 Chintan Palan 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 572
2 个回答

由于 Laravel 使用配置文件来访问和存储 .env 数据,您可以使用 config() 方法即时设置这些数据:

 config(['database.connections.mysql.host' => '127.0.0.1']);

要获取此数据,请使用 config()

 config('database.connections.mysql.host')

要在运行时设置配置值,请将数组传递给 config 助手

https://laravel.com/docs/5.3/configuration#accessing-configuration-values

原文由 Alexey Mezenin 发布,翻译遵循 CC BY-SA 3.0 许可协议

此解决方案可以创建、替换和保存 .env 文件中给定的值。

我创建了它以在命令 package:install 中使用,以将 .env 键值对自动添加到 .env 文件中。

 /**
 * Set .env key-value pair
 *
 * @param array $keyPairs Desired key name
 * @return void
 */
public function saveArrayToEnv(array $keyPairs)
{
    $envFile = app()->environmentFilePath();
    $newEnv = file_get_contents($envFile);

    $newlyInserted = false;

    foreach ($keyPairs as $key => $value) {
        // Make sure key is uppercase (can be left out)
        $key = Str::upper($key);

        if (str_contains($newEnv, "$key=")) {
            // If key exists, replace value
            $newEnv = preg_replace("/$key=(.*)\n/", "$key=$value\n", $newEnv);
        } else {
            // Check if spacing is correct
            if (!str_ends_with($newEnv, "\n\n") && !$newlyInserted) {
                $newEnv .= str_ends_with($newEnv, "\n") ? "\n" : "\n\n";
                $newlyInserted = true;
            }
            // Append new
            $newEnv .= "$key=$value\n";
        }
    }

    $fp = fopen($envFile, 'w');
    fwrite($fp, $newEnv);
    fclose($fp);
}

你传递给它一个关联数组:

 $keyPairs = [
    'KEY' => 'VALUE',
    'API_KEY' => 'XXXXXX-XXXXXX-XXXXX'
]

它将添加它们或用给定值替换给定键的值。当然还有改进的余地,比如检查数组是否真的是一个关联数组。但这适用于 Laravel 命令类等硬编码的东西。

原文由 SneakyLenny 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题