J'ai un CMS personnalisé que je suis en train d'écrire à partir de zéro dans Laravel et je veux définir des valeurs env
telles que les détails de la base de données, les détails de l'expéditeur, la configuration générale, etc. en utilisant l'interface graphique que je fais.
Ma question est donc la suivante: comment puis-je écrire les valeurs reçues de l'utilisateur dans le fichier .env
comme si j'avais besoin du contrôleur.
Et est-ce une bonne idée de créer le fichier .env
lors de vos déplacements ou existe-t-il un autre moyen de le contourner?
Merci d'avance.
Basé sur la réponse de totymedli.
Lorsqu'il est nécessaire de modifier plusieurs valeurs de variable d'environnement simultanément, vous pouvez passer un tableau (clé-> valeur). Toute clé non présente précédemment sera ajoutée et une valeur booléenne est renvoyée pour vous permettre de tester votre succès.
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;
}
Puisque Laravel utilise des fichiers de configuration pour accéder aux données .env
et les stocker, vous pouvez définir ces données à la volée avec la méthode config()
:
config(['database.connections.mysql.Host' => '127.0.0.1']);
Pour obtenir ces données, utilisez config()
:
config('database.connections.mysql.Host')
Pour définir les valeurs de configuration à l'exécution, transmettez un tableau à l'assistant
config
.
https://laravel.com/docs/5.3/configuration#accessing-configuration-values
Fais attention! Toutes les variables de laravel .env ne sont pas stockées dans l'environnement de configuration . Pour écraser du contenu réel .env, utilisez simplement:
putenv ("CUSTOM_VARIABLE = hero");
Pour lire comme d'habitude, env ('CUSTOM_VARIABLE') ou env ('CUSTOM_VARIABLE', 'devault')
Basé sur la réponse de Josh. J'avais besoin d'un moyen de remplacer la valeur d'une clé dans le fichier .env
.
Mais contrairement à la réponse de josh, je ne voulais pas dépendre de connaître la valeur actuelle ou la valeur actuelle accessible dans un fichier de configuration.
Mon objectif étant de remplacer les valeurs utilisées par Laravel Envoy qui n’utilise pas du tout un fichier de configuration mais utilise directement le fichier .env
.
Voici mon point de vue sur elle:
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);
}
Usage:
$this->setEnvironmentValue('DEPLOY_SERVER', '[email protected]');
Plus simplifié:
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)
));
}
ou comme aide:
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)
));
}
}
Si vous souhaitez que ces paramètres soient conservés dans le fichier d'environnement afin qu'ils soient rechargés ultérieurement (même si la configuration est mise en cache), vous pouvez utiliser une fonction comme celle-ci. Je mettrai la mise en garde de sécurité ici, selon laquelle les appels à une méthode comme celle-ci doivent être surveillés de près et les entrées de l'utilisateur doivent être correctement filtrées.
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");
}
}
Un exemple d'utilisation serait:
$this->setEnvironmentValue('APP_LOG_LEVEL', 'app.log_level', 'debug');
$environmentName
est la clé dans le fichier d'environnement (exemple .. APP_LOG_LEVEL)
$configKey
est la clé utilisée pour accéder à la configuration au moment de l'exécution (exemple .. app.log_level (tinker config('app.log_level')
).
$newValue
est bien sûr la nouvelle valeur que vous souhaitez conserver.
Sur la base de la réponse de vesperknight j'ai créé une solution qui n'utilise pas strtok
ou env()
.
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);
}
Ceci n'utilise pas strtok
qui pourrait ne pas fonctionner pour certaines personnes, ni env()
qui ne fonctionnera pas avec les variables .env
entre guillemets qui sont évalués et interpole également les variables incorporées
KEY="Something with spaces or variables ${KEY2}"
vous pouvez utiliser ce package https://github.com/ImLiam/laravel-env-set-command
utilisez ensuite Artisan Facade pour appeler des commandes artisanales ex:
Artisan::call('php artisan env:set app_name Example')
Remplacer la valeur de signature dans la fonction de fichier .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);
}
Exemple en local (laravel), utilisez: set_env ('APP_VERSION', 1.8)
Exemple d'utilisation du chemin personnalisé: set_env ('APP_VERSION', 1.8, $ envfilepath)