如何在laravel中覆盖.env文件变量

b4qexyjb  于 2023-01-06  发布在  其他
关注(0)|答案(1)|浏览(137)

我正在做一个自定义的cms,我希望管理员用户能够修改一些变量从图形用户界面(管理设置)如邮件变量。所以他们可以很容易地改变一些值在环境文件中使用提供的更新形式。
我在自己创建的帮助器文件中创建了一个自定义函数,并向其中添加了以下代码

function changeEnv($key, $value)
{
    $path = base_path('.env');

    if (file_exists($path)) {

        file_put_contents($path, str_replace(
            $key . '=' . env($key), $key . '=' . $value, file_get_contents($path)
        ));
    }
}

然后在我的控制器里我有下面的代码

public function updateEmail(Request $request)
    {
        foreach ($request->types as $key => $type) {
                
            // echo $type . "=" . $request[$type];
            changeEnv($type, $request[$type]);
        }
    }

现在,当我点击更新按钮时,只有带有NULL的viriables得到更新,而不是完全更新,我将得到类似MAIL_PORT=465null的内容。在此之后,除非我手动将其更改为null,否则它们将不再更新。
我的env变量看起来像下面更新前:

MAIL_MAILER=mail
MAIL_HOST=mailhog
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS="hello@example.com"
MAIL_FROM_NAME="${APP_NAME}"

更新后,我会得到:

MAIL_MAILER=mail
MAIL_HOST=mailhog
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=sslnull
MAIL_FROM_ADDRESS="hello@example.com"
MAIL_FROM_NAME="${APP_NAME}"

我将感谢任何帮助,就如何使这一工作完美。

pw9qyyiw

pw9qyyiw1#

  • 不要直接修改.env,因为这会引起几个麻烦(正如评论中提到的@apokryfos),麻烦包括缓存和手动更改这个文件。
  • 使用适当的内置函数修改配置。要在运行时设置配置值,请将数组传递给config函数:config([key => value])。请参见https://laravel.com/docs/9.x/configuration#accessing-configuration-values

此外,您可能需要考虑以下体系结构:

  • 将配置存储在数据库表中。这样你就可以轻松地处理高级功能,比如用户操作日志,并发控制和存储额外的信息。使用一个服务提供商,在 Boot 时从数据库表加载配置值到Laravel配置中。当然,如果你的CMS只为单个或小团队设计,这可能是一个过度的行为。
  • 将您的可管理配置写入一个自定义配置文件,该文件位于 config/ 目录中,可能会覆盖所有其他默认配置值。优点是Laravel可以像以前一样处理它,您可以从缓存等功能中受益。
    缓存

始终确保在更改配置后重置配置缓存。您可以通过编程方式执行此操作。请参阅https://laravel.com/docs/9.x/artisan#programmatically-executing-commands示例:

Artisan::call('cache:clear')

相关问题