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

问题描述 投票:0回答:2

我正在制作一个客户CMS,我希望管理员用户能够从GUI(管理设置)修改一些变量,例如邮件变量。因此,他们可以使用提供的更新表单轻松更改环境文件中的某些值。

我在创建的帮助程序文件中创建了一个自定义函数,并向其中添加了以下代码

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,否则它们将不再更新。

更新前我的环境变量如下所示:

MAIL_MAILER=mail
MAIL_HOST=mailhog
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS="[email protected]"
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="[email protected]"
MAIL_FROM_NAME="${APP_NAME}"

我将不胜感激任何关于如何完美地完成这项工作的帮助。

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

此外,您可能需要考虑以下架构:

  • 将配置存储在数据库表中。因此,您可以轻松处理高级功能,例如用户操作日志记录、并发控制和存储附加信息。使用服务提供程序,在启动时将配置值从数据库表加载到 Laravel 配置中。当然,如果您的 CMS 是专为单个或小型团队设计的,那么这可能有点过分了。
  • 将您的可管理配置写入自定义配置文件,该文件位于 config/ 目录中,并且可能会覆盖所有其他默认配置值。优点是 Laravel 可以像以前一样处理它,并且您可以从缓存等功能中受益。

缓存

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

Artisan::call('cache:clear')

0
投票

经过很长一段时间,在每天使用 Laravel 的过程中,我已经弄清楚了。

$envFile = base_path('.env');

        // Read the existing .env file into an array
        $envContent = file($envFile);

        // Loop through the array and update the values for the specified environment variables
        foreach ($envContent as $key => $line) {
            foreach ($data->all() as $envKey => $envValue) {
                if (Str::startsWith($line, $envKey)) {
                    $envContent[$key] = "$envKey=\"" . addslashes($envValue) . "\"\n";
                }
            }
        }

    // Write the updated .env file
    file_put_contents($envFile, implode('', $envContent));

$data 变量只是表单输入,您可以将其用作

$request->all();

该代码有效并且一直为我工作

© www.soinside.com 2019 - 2024. All rights reserved.