.env 값을 즉시 프로그래밍 방식으로 라벨로 설정하는 방법
라라벨에서 처음부터 작성하는 사용자 지정 CMS가 있으며 설정하고 싶습니다.env
사용자가 설정한 후 사용자에게 내가 만들고 있는 GUI를 사용하여 이동 중에 변경할 수 있는 유연성을 제공하고자 하는 컨트롤러의 데이터베이스 세부 정보, 메일러 세부 정보, 일반 구성 등의 값.
그래서 제 질문은 사용자로부터 받은 값을 어떻게 작성해야 하는지입니다..env
컨트롤러에서 필요할 때 파일로 저장합니다.
그리고 그것을 만드는 것이 좋은 생각인가요?.env
이동 중인 파일 또는 다른 방법이 있습니까?
하여 Laravel에 하고 저장하기 입니다..env
이, 이 설 데 즉 있 수 니 다 습 할 정시 를 터 ▁dataconfig()
방법:
config(['database.connections.mysql.host' => '127.0.0.1']);
이 데이터를 가져오는 방법config()
:
config('database.connections.mysql.host')
런타임에을 임에구값설면려어에레전다로 합니다.
config
https://laravel.com/docs/5.3/configuration#accessing-configuration-values
조심해!laravel.env의 모든 변수가 구성 환경에 저장되지는 않습니다.real .env 콘텐츠를 덮어쓰려면 다음을 간단히 사용합니다.
putenv("CUSTOM_VARIVEL=hero");
평소대로 읽으려면 env('CUSTOM_VARIVEL') 또는 env('CUSTOM_VARIVEL', 'devault')
참고: 앱에서 env 설정을 사용하는 부분에 따라 변수를 index.php 또는 bootstrap.php 파일에 넣어 조기에 설정해야 할 수도 있습니다.앱 서비스 공급자에서 설정하는 것은 일부 패키지/환경 설정 사용에 너무 늦을 수 있습니다.
더욱 단순화된 기능:
public function putPermanentEnv($key, $value)
{
$path = app()->environmentFilePath();
$escaped = preg_quote('='.env($key), '/');
file_put_contents($path, preg_replace(
"/^{$key}{$escaped}/m",
"{$key}={$value}",
file_get_contents($path)
));
}
또는 도우미로서:
if ( ! function_exists('put_permanent_env'))
{
function put_permanent_env($key, $value)
{
$path = app()->environmentFilePath();
$escaped = preg_quote('='.env($key), '/');
file_put_contents($path, preg_replace(
"/^{$key}{$escaped}/m",
"{$key}={$value}",
file_get_contents($path)
));
}
}
토티메들리의 대답을 근거로 합니다.
여러 환경 변수 값을 한 번에 변경해야 하는 경우 배열(키->값)을 전달할 수 있습니다.이전에 없는 키가 추가되고 성공 여부를 테스트할 수 있도록 풀이 반환됩니다.
public function setEnvironmentValue(array $values)
{
$envFile = app()->environmentFilePath();
$str = file_get_contents($envFile);
if (count($values) > 0) {
foreach ($values as $envKey => $envValue) {
$str .= "\n"; // In case the searched variable is in the last line without \n
$keyPosition = strpos($str, "{$envKey}=");
$endOfLinePosition = strpos($str, "\n", $keyPosition);
$oldLine = substr($str, $keyPosition, $endOfLinePosition - $keyPosition);
// If key does not exist, add it
if (!$keyPosition || !$endOfLinePosition || !$oldLine) {
$str .= "{$envKey}={$envValue}\n";
} else {
$str = str_replace($oldLine, "{$envKey}={$envValue}", $str);
}
}
}
$str = substr($str, 0, -1);
if (!file_put_contents($envFile, $str)) return false;
return true;
}
조쉬의 대답을 토대로.▁the▁inside 안에 있는 했습니다..env
java.
그러나 Josh의 답변과 달리 구성 파일에서 현재 값이나 현재 값에 액세스할 수 있는지 여부를 아는 것에 전혀 의존하고 싶지 않았습니다.
을 전혀 사용하지이기 때문입니다..env
직접 철하다
다음은 제 생각입니다.
public function setEnvironmentValue($envKey, $envValue)
{
$envFile = app()->environmentFilePath();
$str = file_get_contents($envFile);
$oldValue = strtok($str, "{$envKey}=");
$str = str_replace("{$envKey}={$oldValue}", "{$envKey}={$envValue}\n", $str);
$fp = fopen($envFile, 'w');
fwrite($fp, $str);
fclose($fp);
}
용도:
$this->setEnvironmentValue('DEPLOY_SERVER', 'forge@122.11.244.10');
#더 간단한 커버 방법.env 당신은 이렇게 할 수 있습니다.
$_ENV['key'] = 'value';
tl;dr
vesperknight의 답변을 바탕으로 또는 를 사용하지 않는 솔루션을 만들었습니다.
private function setEnvironmentValue($envKey, $envValue)
{
$envFile = app()->environmentFilePath();
$str = file_get_contents($envFile);
$str .= "\n"; // In case the searched variable is in the last line without \n
$keyPosition = strpos($str, "{$envKey}=");
$endOfLinePosition = strpos($str, PHP_EOL, $keyPosition);
$oldLine = substr($str, $keyPosition, $endOfLinePosition - $keyPosition);
$str = str_replace($oldLine, "{$envKey}={$envValue}", $str);
$str = substr($str, 0, -1);
$fp = fopen($envFile, 'w');
fwrite($fp, $str);
fclose($fp);
}
설명.
이것은 사용되지 않습니다.strtok
어떤 사람들에게는 효과가 없을 수도 있고, 혹은.env()
더블 버튼을 사용하면 작동하지 않을 것입니다..env
평가되고 내장된 변수를 보간하는 변수
KEY="Something with spaces or variables ${KEY2}"
.env 파일에 변경 사항을 저장할 필요가 없다면 다음 코드를 사용하면 됩니다.
\Illuminate\Support\Env::getRepository()->set('APP_NAME','New app name');
이러한 설정이 나중에 다시 로드되도록 환경 파일에 지속되도록 하려면(구성이 캐시된 경우에도) 다음과 같은 기능을 사용할 수 있습니다.보안 경고를 넣겠습니다. 이와 같은 방법에 대한 호출은 철저히 차단되어야 하며 사용자 입력은 제대로 검사되어야 합니다.
private function setEnvironmentValue($environmentName, $configKey, $newValue) {
file_put_contents(App::environmentFilePath(), str_replace(
$environmentName . '=' . Config::get($configKey),
$environmentName . '=' . $newValue,
file_get_contents(App::environmentFilePath())
));
Config::set($configKey, $newValue);
// Reload the cached config
if (file_exists(App::getCachedConfigPath())) {
Artisan::call("config:cache");
}
}
그 사용의 예는 다음과 같습니다.
$this->setEnvironmentValue('APP_LOG_LEVEL', 'app.log_level', 'debug');
$environmentName
는 환경 파일의 키입니다(아래 참조).APP_LOG_LEVEL)
$configKey
는 런타임에 구성에 액세스하는 데 사용되는 키입니다(아래 참조).app.log_level(분할자)config('app.log_level')
).
$newValue
물론 유지하고자 하는 새로운 가치입니다.
일시적으로 변경하려는 경우(예: 테스트의 경우), Laravel 8에 적용됩니다.
<?php
namespace App\Helpers;
use Dotenv\Repository\Adapter\ImmutableWriter;
use Dotenv\Repository\AdapterRepository;
use Illuminate\Support\Env;
class DynamicEnvironment
{
public static function set(string $key, string $value)
{
$closure_adapter = \Closure::bind(function &(AdapterRepository $class) {
$closure_writer = \Closure::bind(function &(ImmutableWriter $class) {
return $class->writer;
}, null, ImmutableWriter::class);
return $closure_writer($class->writer);
}, null, AdapterRepository::class);
return $closure_adapter(Env::getRepository())->write($key, $value);
}
}
용도:
App\Helpers\DynamicEnvironment::set("key_name", "value");
토티메들리의 대답과 올루와피사요의 대답을 바탕으로 합니다.
.env 파일을 변경하기 위해 약간의 수정을 설정했는데, Laravel 5.8에서 너무 잘 작동하지만, 변경 후 .env 파일이 수정되었을 때 phpartisan serve로 다시 시작한 후 변수가 변경되지 않는 것을 볼 수 있어서 캐시 등을 지우려고 했지만 해결책이 보이지 않습니다.
public function setEnvironmentValue(array $values)
{
$envFile = app()->environmentFilePath();
$str = file_get_contents($envFile);
$str .= "\r\n";
if (count($values) > 0) {
foreach ($values as $envKey => $envValue) {
$keyPosition = strpos($str, "$envKey=");
$endOfLinePosition = strpos($str, "\n", $keyPosition);
$oldLine = substr($str, $keyPosition, $endOfLinePosition - $keyPosition);
if (is_bool($keyPosition) && $keyPosition === false) {
// variable doesnot exist
$str .= "$envKey=$envValue";
$str .= "\r\n";
} else {
// variable exist
$str = str_replace($oldLine, "$envKey=$envValue", $str);
}
}
}
$str = substr($str, 0, -1);
if (!file_put_contents($envFile, $str)) {
return false;
}
app()->loadEnvironmentFrom($envFile);
return true;
}
따라서 함수 집합 EnvironmentValue를 사용하여 .env 파일을 올바르게 다시 작성하지만 Laravel은 시스템을 다시 시작하지 않고 어떻게 새 .env를 다시 로드할 수 있습니까?
그것에 대한 정보를 찾다가 발견했습니다.
Artisan::call('cache:clear');
하지만 로컬에서는 작동하지 않습니다! 하지만 서브에서 코드와 테스트를 업로드하면 정상적으로 작동합니다.
라브 5.8에서 테스트를 했고 서브에서 일했습니다
이것은 하나 이상의 단어를 가진 변수와 공백을 가진 변수가 있을 때 팁이 될 수 있습니다.
public function update($variable, $value)
{
if ($variable == "APP_NAME" || $variable == "MAIL_FROM_NAME") {
$value = "\"$value\"";
}
$values = array(
$variable=>$value
);
$this->setEnvironmentValue($values);
Artisan::call('config:clear');
return true;
}
맞춤형 Otwell은 라벨 응용 프로그램 키를 생성하고 다음 코드(예를 들어 수정된 코드)를 사용하여 값을 설정합니다.
$escaped = preg_quote('='.config('broadcasting.default'), '/');
file_put_contents(app()->environmentFilePath(), preg_replace("/^BROADCAST_DRIVER{$escaped}/m", 'BROADCAST_DRIVER='.'pusher',
file_get_contents(app()->environmentFilePath())
));
키 생성 클래스에서 코드를 찾을 수 있습니다.Illuminate\Foundation\Console\KeyGenerateCommand
이 패키지를 사용할 수 있습니다. https://github.com/ImLiam/laravel-env-set-command
그런 다음 Artisan Facade를 사용하여 Artisan 명령 ex를 호출합니다.
Artisan::call('php artisan env:set app_name Example')
PHP 8 솔루션
이 솔루션은 다음을 사용합니다.env()
따라서 구성이 캐시되지 않은 경우에만 실행해야 합니다.
/**
* @param string $key
* @param string $value
*/
protected function setEnvValue(string $key, string $value)
{
$path = app()->environmentFilePath();
$env = file_get_contents($path);
$old_value = env($key);
if (!str_contains($env, $key.'=')) {
$env .= sprintf("%s=%s\n", $key, $value);
} else if ($old_value) {
$env = str_replace(sprintf('%s=%s', $key, $old_value), sprintf('%s=%s', $key, $value), $env);
} else {
$env = str_replace(sprintf('%s=', $key), sprintf('%s=%s',$key, $value), $env);
}
file_put_contents($path, $env);
}
이 함수는 기존 키의 새 값을 업데이트하거나 파일 끝에 새 키=값을 추가합니다.
function setEnv($envKey, $envValue) {
$path = app()->environmentFilePath();
$escaped = preg_quote('='.env($envKey), '/');
//update value of existing key
file_put_contents($path, preg_replace(
"/^{$envKey}{$escaped}/m",
"{$envKey}={$envValue}",
file_get_contents($path)
));
//if key not exist append key=value to end of file
$fp = fopen($path, "r");
$content = fread($fp, filesize($path));
fclose($fp);
if (strpos($content, $envKey .'=' . $envValue) == false && strpos($content, $envKey .'=' . '\"'.$envValue.'\"') == false){
file_put_contents($path, $content. "\n". $envKey .'=' . $envValue);
}
}
$envFile = app()->environmentFilePath();
$_ENV['APP_NAME'] = "New Project Name";
$txt= "";
foreach ($_ENV as $key => $value) {
$txt .= $key."=".$value."\n"."\n";
}
file_put_contents($envFile,$txt);
이 솔루션은 .env 파일에 지정된 값을 생성, 대체 및 저장할 수 있습니다.
인 에사용수있만들다니습었도록할에 이것을 .package:install
을 .합니다.env 키-값 쌍을 .env 파일에 자동으로 추가합니다.
/**
* Set .env key-value pair
*
* @param array $keyPairs Desired key name
* @return void
*/
public function saveArrayToEnv(array $keyPairs)
{
$envFile = app()->environmentFilePath();
$newEnv = file_get_contents($envFile);
$newlyInserted = false;
foreach ($keyPairs as $key => $value) {
// Make sure key is uppercase (can be left out)
$key = Str::upper($key);
if (str_contains($newEnv, "$key=")) {
// If key exists, replace value
$newEnv = preg_replace("/$key=(.*)\n/", "$key=$value\n", $newEnv);
} else {
// Check if spacing is correct
if (!str_ends_with($newEnv, "\n\n") && !$newlyInserted) {
$newEnv .= str_ends_with($newEnv, "\n") ? "\n" : "\n\n";
$newlyInserted = true;
}
// Append new
$newEnv .= "$key=$value\n";
}
}
$fp = fopen($envFile, 'w');
fwrite($fp, $newEnv);
fclose($fp);
}
연관 배열을 전달합니다.
$keyPairs = [
'KEY' => 'VALUE',
'API_KEY' => 'XXXXXX-XXXXXX-XXXXX'
]
그리고 지정된 키의 값을 추가하거나 지정된 값으로 대체합니다.물론 배열이 실제로 연관 배열인지 확인하는 것과 같은 개선의 여지가 있습니다.하지만 이것은 라라벨 명령 클래스와 같은 하드 코딩된 것들에 적합합니다.
Elias Tutungi가 제공한 솔루션을 기반으로 구축된 이 솔루션은 여러 가지 가치 변화를 수용하고 각각의 가치가 총체적이기 때문에 Laravel Collection을 사용합니다.
function set_environment_value($values = [])
{
$path = app()->environmentFilePath();
collect($values)->map(function ($value, $key) use ($path) {
$escaped = preg_quote('='.env($key), '/');
file_put_contents($path, preg_replace(
"/^{$key}{$escaped}/m",
"{$key}={$value}",
file_get_contents($path)
));
});
return true;
}
당신은 인터넷에서 위치한 이 사용자 정의 방법을 사용할 수 있습니다.
/**
* Calls the method
*/
public function something(){
// some code
$env_update = $this->changeEnv([
'DB_DATABASE' => 'new_db_name',
'DB_USERNAME' => 'new_db_user',
'DB_HOST' => 'new_db_host'
]);
if($env_update){
// Do something
} else {
// Do something else
}
// more code
}
protected function changeEnv($data = array()){
if(count($data) > 0){
// Read .env-file
$env = file_get_contents(base_path() . '/.env');
// Split string on every " " and write into array
$env = preg_split('/\s+/', $env);;
// Loop through given data
foreach((array)$data as $key => $value){
// Loop through .env-data
foreach($env as $env_key => $env_value){
// Turn the value into an array and stop after the first split
// So it's not possible to split e.g. the App-Key by accident
$entry = explode("=", $env_value, 2);
// Check, if new key fits the actual .env-key
if($entry[0] == $key){
// If yes, overwrite it with the new one
$env[$env_key] = $key . "=" . $value;
} else {
// If not, keep the old one
$env[$env_key] = $env_value;
}
}
}
// Turn the array back to an String
$env = implode("\n", $env);
// And overwrite the .env with the new data
file_put_contents(base_path() . '/.env', $env);
return true;
} else {
return false;
}
}
아래 함수를 사용하여 .env 파일 레이블의 값을 변경합니다.
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)
));
}
}
.env 파일 함수의 단일 값 바꾸기:
/**
* @param string $key
* @param string $value
* @param null $env_path
*/
function set_env(string $key, string $value, $env_path = null)
{
$value = preg_replace('/\s+/', '', $value); //replace special ch
$key = strtoupper($key); //force upper for security
$env = file_get_contents(isset($env_path) ? $env_path : base_path('.env')); //fet .env file
$env = str_replace("$key=" . env($key), "$key=" . $value, $env); //replace value
/** Save file eith new content */
$env = file_put_contents(isset($env_path) ? $env_path : base_path('.env'), $env);
}
: " "(으)" " " " " ":set_env('APP_VERSION', 1.8)
.
경로를 예: 사자지경사용예는하set_env('APP_VERSION', 1.8, $envfilepath)
.
언급URL : https://stackoverflow.com/questions/40450162/how-to-set-env-values-in-laravel-programmatically-on-the-fly
'programing' 카테고리의 다른 글
현재 실행 중인 PowerShell 스크립트의 경로 (0) | 2023.08.07 |
---|---|
SQL*Plus는 SQL Developer가 실행하는 SQL 스크립트를 실행하지 않습니다. (0) | 2023.08.07 |
Android 롤리팝 카드 보기에 미치는 파급 효과 (0) | 2023.08.07 |
git clone --mirror를 업데이트하는 방법은 무엇입니까? (0) | 2023.08.07 |
Google Analytics에 아직 동의하지 않은 사용자의 쿠키 사용을 금지하는 설정이 있습니까? (0) | 2023.08.07 |