web-dev-qa-db-fra.com

Comment définir les valeurs .env dans laravel par programmation à la volée

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.

7
Chintan Palan

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;

}
3
Oluwafisayo

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 ​​

24
Alexey Mezenin

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')

14
Oliver Maslo

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]');
13
vesperknight

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)
        ));
    }
}
5
Elias Tutungi

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.

4
Josh

tl; dr

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

Explication

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}"
3
totymedli

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')
0
atoui ahmed

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)

0
Mwspace LLC