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

时间:2015-08-31 08:56:38

标签: php laravel

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

9 个答案:

答案 0 :(得分:29)

没有内置的方法可以做到这一点。如果您真的想要更改.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文件可能不是最好的主意。对于大多数自定义设置,我建议将它们存储在数据库中,但如果设置本身是连接数据库所必需的,这显然是个问题。

答案 1 :(得分:3)

另一种实现方式,如果您有类似的内容:

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);
}

答案 2 :(得分:3)

更新Erick的答案时考虑了$old值,包括sting,bool和null值。

public static function changeEnvironmentVariable($key,$value)
{
    $path = base_path('.env');

    if(is_bool(env($key)))
    {
        $old = env($key)? 'true' : 'false';
    }
    elseif(env($key)===null){
        $old = 'null';
    }
    else{
        $old = env($key);
    }

    if (file_exists($path)) {
        file_put_contents($path, str_replace(
            "$key=".$old, "$key=".$value, file_get_contents($path)
        ));
    }
}

答案 3 :(得分:1)

我遇到了同样的问题并创建了下面的功能

function unhash (hash) {
    var originalString = "";
    var mod = 37;
    var letters = "acdegilmnoprstuw";
    while( hash != 7) {
        var index = hash % mod;
        originalString = letters[(Int32Array)index] + originalString; // I'm not sure what the javascript version of int32
        hash = (hash - index) / mod;
    }
}
alert(hash("leepadg")); // this is the correct output 680131659347 
alert(unhash( 680131659347)); //output supposed to be leepadg but returning undefined

答案 4 :(得分:1)

要扩展上述lukasgeiter和其他人的答案,使用正则表达式匹配.env会更好,因为与app.key不同,放入.env的变量可能不在配置。

下面是我在尝试自定义工匠命令时使用的代码。此代码生成用于XChaCha加密(XCHACHA_KEY=?????)的密钥:


$path = base_path('.env');
if (file_exists($path)) {
    //Try to read the current content of .env
    $current = file_get_contents($path);   

    //Store the key
    $original = [];
    if (preg_match('/^XCHACHA_KEY=(.+)$/m', $current, $original)) { 
    //Write the original key to console
        $this->info("Original XChaCha key: $original[0]"); 

    //Overwrite with new key
        $current = preg_replace('/^XCHACHA_KEY=.+$/m', "XCHACHA_KEY=$b64", $current);

    } else {
    //Append the key to the end of file
        $current .= PHP_EOL."XCHACHA_KEY=$b64";
    }
    file_put_contents($path, $current);
}
$this->info('Successfully generated new key for XChaCha');

使用preg_match()可以根据需要检索原始密钥,即使实际值未知,也可以更改密钥。

答案 5 :(得分:1)

public function setEnvironmentValue($key, $value) {
 $path = $_SERVER['DOCUMENT_ROOT'] . '/.env';

 if (file_exists($path)) {
   if (getenv($key)) {
     //replace variable if key exit
     file_put_contents($path, str_replace(
       "$key=" . getenv($key), "$key=" . $value, file_get_contents($path)
     ));
   } else {
     //set if variable key not exit
     $file   = file($path);
     $file[] = "$key=" . $value;
     file_put_contents($path, $file);
   }
 }
}

答案 6 :(得分:0)

   /**
     * Update Laravel Env file Key's Value
     * @param string $key
     * @param string $value
     */
    public static function envUpdate($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)
            ));
        }
    }

答案 7 :(得分:0)

另一种选择是使用配置文件代替更改.env文件中的内容

将所有这些文件放入newfile.php文件夹中名为config的任何配置文件中。如果您实际上不想更改.evn的内容。并将它们全部视为变量/数组元素。

<?php

return [
    'PUSHER_APP_ID' => "",
    'PUSHER_APP_KEY' => "",
    'PUSHER_APP_SECRET' => "",
    'PUSHER_APP_CLUSTER' => "",
];

并在如下所示的控制器中获取/设置

config(['newfile.PUSHER_APP_ID' => 'app_id_value']);//set

config('newfile.PUSHER_APP_ID');//get

答案 8 :(得分:0)

/**
 * @param string $key
 * @param string $val
 */
protected function writeNewEnvironmentFileWith(string $key, string $val)
{
    file_put_contents($this->laravel->environmentFilePath(), preg_replace(
        $this->keyReplacementPattern($key),
        $key . '=' . $val,
        file_get_contents($this->laravel->environmentFilePath())
    ));
}

/**
 * @param string $key
 * @return string
 */
protected function keyReplacementPattern(string $key): string
{
    $escaped = preg_quote('=' . env($key), '/');

    return "/^" . $key . "{$escaped}/m";
}