如何在 Laravel 中动态更改 .env 文件中的变量?

新手上路,请多包涵

我想创建一个 Laravel 网络应用程序,允许管理员用户使用网络后端系统更改 .env 文件中的一些变量(例如数据库凭据)。但是如何保存更改?

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

阅读 305
2 个回答

没有内置的方法可以做到这一点。如果你真的想改变 .env 文件的内容,你将不得不使用某种字符串替换结合PHP的文件写入方法。要获得一些灵感,您应该查看 key:generate 命令: KeyGenerateCommand.php

 $path = base_path('.env');

if (file_exists($path)) {
    file_put_contents($path, str_replace(
        'APP_KEY='.$this->laravel['config']['app.key'], 'APP_KEY='.$key, file_get_contents($path)
    ));
}

构建文件路径并检查是否存在后,该命令只需将 APP_KEY=[current app key] 替换为 APP_KEY=[new app key] 。您应该能够用其他变量进行相同的字符串替换。

最后但同样重要的是,我只想说让用户更改 .env 文件可能不是最好的主意。对于大多数自定义设置,我建议将它们存储在数据库中,但是如果设置本身是连接到数据库所必需的,这显然是一个问题。

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

另一个实现,如果你有类似的东西:

A = B #这是一个有效条目

在你的 .env 文件中

public function updateEnv($data = array())
{
    if (!count($data)) {
        return;
    }

    $pattern = '/([^\=]*)\=[^\n]*/';

    $envFile = base_path() . '/.env';
    $lines = file($envFile);
    $newLines = [];
    foreach ($lines as $line) {
        preg_match($pattern, $line, $matches);

        if (!count($matches)) {
            $newLines[] = $line;
            continue;
        }

        if (!key_exists(trim($matches[1]), $data)) {
            $newLines[] = $line;
            continue;
        }

        $line = trim($matches[1]) . "={$data[trim($matches[1])]}\n";
        $newLines[] = $line;
    }

    $newContent = implode('', $newLines);
    file_put_contents($envFile, $newContent);
}

原文由 Daniel Teleginski Camargo 发布,翻译遵循 CC BY-SA 3.0 许可协议

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