我想创建一个Laravel Web应用程序,允许管理员用户使用Web后端系统更改.env文件中的某些变量(例如数据库凭据)。但是如何保存更改?
答案 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";
}