Laravel 5.5 如何在单个控制器中从 .env 写入和重新加载变量
How to write and reload variables from .env in a single controller in Laravel 5.5
背景:
我尝试使用 Laravel 5.5 编写安装向导。一些数据库参数(数据库名称、用户、密码)应该写入 .env 文件然后进行验证。写作过程可以用来完成。
遇到的问题:
在成功将发布的变量写入.env 文件后,我尝试使用 env('DB_DATABASE')
之类的代码重新加载变量。我发现变量保持不变。但是在我刷新页面后,变量将更改为正确的。我确实在刷新页面之前检查了 .env 文件中的变量已经更新。
我试过的:
我试图找到解决办法。大多数解决方案是指使用 artisan config:clear
命令。所以我像这样将 artisan 命令放到我的控制器中:
$this->changeEnvironmentVariable('DB_DATABASE',$request->input('db_name'));
$this->changeEnvironmentVariable('DB_USERNAME',$request->input('db_user'));
$this->changeEnvironmentVariable('DB_PASSWORD',$request->input('db_password'));
Artisan::call('config:clear');
虽然没有警告和错误,但它不起作用。 env('DB_DATABASE')
仍然保持以前的值。
问题:
我可以通过使用发布的信息验证数据库信息而不是从 .env 文件加载变量来解决这个问题。但是,我只想知道是否有办法在 real-time.
中写入和重新加载 .env 变量
如有任何意见,我们将不胜感激。
我创建了一个 readEnv
和 changeEnv
方法来读写 .env
文件而不直接使用 env()
。这可以避免使用缓存的数据。希望能帮到和我一样有类似需求的人。
public function readEnv(){
$root_dir = realpath(dirname(getcwd()));
$ini_array = parse_ini_file($root_dir.'\.env', true, INI_SCANNER_RAW);
$this->env_str[0] = $ini_array['DB_DATABASE'];
$this->env_str[1] = $ini_array['DB_USERNAME'];
$this->env_str[2] = $ini_array['DB_PASSWORD'];
return;
}
public static function changeEnv($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)
));
}
}
您的环境写入可以成功,但无需重新加载页面或转到另一个 link 此 env 值不会更改。如果需要在当前控制器或 link 中应用此值,您可以使用以下行。
putenv('DB_DATABASE='.$request->input('db_name'));
putenv('DB_USERNAME='.$request->input('db_user'));
putenv('DB_PASSWORD='.$request->input('db_password'));
现在 env('DB_DATABASE')
将显示您的输入值的输出。
背景:
我尝试使用 Laravel 5.5 编写安装向导。一些数据库参数(数据库名称、用户、密码)应该写入 .env 文件然后进行验证。写作过程可以用
遇到的问题:
在成功将发布的变量写入.env 文件后,我尝试使用 env('DB_DATABASE')
之类的代码重新加载变量。我发现变量保持不变。但是在我刷新页面后,变量将更改为正确的。我确实在刷新页面之前检查了 .env 文件中的变量已经更新。
我试过的:
我试图找到解决办法。大多数解决方案是指使用 artisan config:clear
命令。所以我像这样将 artisan 命令放到我的控制器中:
$this->changeEnvironmentVariable('DB_DATABASE',$request->input('db_name'));
$this->changeEnvironmentVariable('DB_USERNAME',$request->input('db_user'));
$this->changeEnvironmentVariable('DB_PASSWORD',$request->input('db_password'));
Artisan::call('config:clear');
虽然没有警告和错误,但它不起作用。 env('DB_DATABASE')
仍然保持以前的值。
问题:
我可以通过使用发布的信息验证数据库信息而不是从 .env 文件加载变量来解决这个问题。但是,我只想知道是否有办法在 real-time.
中写入和重新加载 .env 变量如有任何意见,我们将不胜感激。
我创建了一个 readEnv
和 changeEnv
方法来读写 .env
文件而不直接使用 env()
。这可以避免使用缓存的数据。希望能帮到和我一样有类似需求的人。
public function readEnv(){
$root_dir = realpath(dirname(getcwd()));
$ini_array = parse_ini_file($root_dir.'\.env', true, INI_SCANNER_RAW);
$this->env_str[0] = $ini_array['DB_DATABASE'];
$this->env_str[1] = $ini_array['DB_USERNAME'];
$this->env_str[2] = $ini_array['DB_PASSWORD'];
return;
}
public static function changeEnv($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)
));
}
}
您的环境写入可以成功,但无需重新加载页面或转到另一个 link 此 env 值不会更改。如果需要在当前控制器或 link 中应用此值,您可以使用以下行。
putenv('DB_DATABASE='.$request->input('db_name'));
putenv('DB_USERNAME='.$request->input('db_user'));
putenv('DB_PASSWORD='.$request->input('db_password'));
现在 env('DB_DATABASE')
将显示您的输入值的输出。