web-dev-qa-db-fra.com

Quelle est la bonne façon de définir les variables ENV dans Laravel 5?

Dans laravel 4 nous avions:

$env = $app->detectEnvironment(array(
    'local' => array('Homestead')
));

par défaut.

Mais dans laravel 5, il est remplacé par:

$env = $app->detectEnvironment(function()
{
    return getenv('APP_ENV') ?: 'production';
});

En outre, ils ont exclu . Env. * ligne dans .gitignore, maintenant il a:

.env

Et ajouté le fichier .env.example:

APP_ENV=local
APP_KEY=SomeRandomString
DB_USERNAME=Homestead
DB_PASSWORD=Homestead

Donc, si j'ai plus de 2 environnements, dois-je tous les placer dans un seul fichier .env maintenant? Par exemple.:

APP_ENV=local
DB_PASSWORD=123

APP_ENV=alpha
DB_PASSWORD=456

Si je n'ai pas de fichier .env, comment laravel saura quel environnement j'utilise?

29
Alexander Kim

Vous pouvez le faire exactement comme dans Laravel 4:

$env = $app->detectEnvironment(array(
    'local' => array('Homestead')
));

Les fichiers *.env Servent simplement à mettre des données sensibles qui ne doivent pas être placées dans VCS. La même chose est dans Laravel 4

mais il semble que dans les derniers jours, detectEnvironment par défaut a été remplacé par:

$env = $app->detectEnvironment(function()
{
    return getenv('APP_ENV') ?: 'production';
});

vous pouvez donc utiliser la variable de réglage du nom du PC ou du fichier ENV.

Si vous utilisez la détection d'environnement basée sur ENV dans le fichier env principal (par défaut, le fichier .env Vous devez ajouter:

APP_ENV=local

Bien sûr, local est un environnement local, vous pouvez le changer en production ou dev

Pour le moment, le problème le plus important que je vois est que vous devez vous rappeler, lors de la production, de modifier le contenu de ce fichier .env De APP_ENV=local À APP_ENV=production. méthode est l'ancienne méthode par défaut basée sur les noms de PC.

Maintenant, les fichiers ENV. Si vous utilisez la détection d'environnement basée sur ENV, vous ne devez mettre dans votre fichier ENV que:

APP_ENV=local

Vous pouvez maintenant créer des fichiers ENV distincts pour vos différents environnements, par exemple:

. local.env:

 MY_DB=testdb

. production.env:

MY_DB=productiondb

et maintenant dans le fichier bootstrap.environment.php vous pouvez modifier:

if (file_exists(__DIR__.'/../.env'))
{
    Dotenv::load(__DIR__.'/../');
}

dans:

if (file_exists(__DIR__.'/../.env'))
{
    Dotenv::load(__DIR__.'/../');

    if (getenv('APP_ENV') && file_exists(__DIR__.'/../.' .getenv('APP_ENV') .'.env')) {
        Dotenv::load(__DIR__ . '/../', '.' . getenv('APP_ENV') . '.env');
    }   
}

charger un fichier env supplémentaire basé sur APP_ENV à partir du fichier env principal.

Vous pourrez maintenant l’utiliser dans votre autre fichier de configuration, comme toujours: $_ENV['MY_DB']

30
Marcin Nabiałek

Pour ceux qui viennent de passer à la version 5.2:

Vous ne pouvez plus utiliser la méthode statique Dotenv::load(). Utilisez les éléments suivants à la place:

$dotenv = new Dotenv\Dotenv(__DIR__ . '/../', '.' . getenv('APP_ENV') . '.env'); // Laravel 5.2
$dotenv->load();

dans bootstrap/app.php.

// edit Soo .. après avoir approfondi cette question pendant une heure, je pourrais aussi bien ajouter quelques informations supplémentaires ici:

  • Laravel utilise des fichiers .env pour la configuration
  • Par défaut, le fichier ".env" situé dans le répertoire racine de l'application est chargé.
  • Vous pouvez accéder aux valeurs de ces fichiers .env via la fonction d'assistance env() ou directement via la fonction native getenv() de PHP. Bien que vous ne devriez le faire que pour remplir vos fichiers de configuration (voir /config/*.php), Car ceux-ci peuvent être mis en cache .
  • les fichiers .env sont chargés dans la classe DetectEnvironment . J'ai trouvé cela utile lors du débogage pour définir des points d'arrêt. Veuillez prendre note de la ligne (new Dotenv($app->environmentPath(), $app->environmentFile()))->load();: Puisqu'elle utilise load(), aucune valeur d'environnement déjà définie ne sera écrasé! (Vous devez utiliser overload() pour le faire - cela m’a conduit nuts car Homestead définit le APP_ENV variable to local dans la configuration php-fpm /etc/php/7.0/fpm/php-fpm.conf et vous ne pouvez pas le changer via un fichier .env)
  • lorsque vous écrivez des tests unitaires, vous héritez généralement de TestCase , ce qui définit la variable APP_ENV sur testing (via refreshApplication() = - utilise putenv() pour remplacer la valeur par défaut local)
12
Hirnhamster

Je voulais juste contribuer ma solution pour Laravel 5.1, ce qui est un peu plus simple à mon humble avis. Dans bootstrap/app.php, j'ai (juste après l'endroit où l'application est instanciée):

$app->beforeBootstrapping(\Illuminate\Foundation\Bootstrap\DetectEnvironment::class, function() use ($app) {
    $suffix = (env('APP_ENV')) 
        ? '.'.env('APP_ENV') 
        : '';
    $app->loadEnvironmentFrom('.env'.$suffix);
});

Aucune vérification ni traitement d'erreur n'est nécessaire. Laravel passera par défaut à "production" si le fichier n’est pas trouvé.

C'est tout.

1
thefuzzy0ne

Le fait que vous ne pouvez pas avoir plus d'un fichier .env Par défaut et qu'il est exclu dans .gitignore est intentionnel et constitue le moyen prévu pour gérer les environnements. Le fichier .env Ne doit pas figurer dans le contrôle de version et doit être configuré pour chaque environnement. .env Définit votre environnement et toutes les variables d'environnement.

Donc, si j'ai plus de 2 environnements, dois-je tous les placer dans un seul fichier .env maintenant?

Non. Vous auriez un fichier .env À chaque endroit où votre application serait installée. La différence réside dans ce qui se trouve dans ce fichier.

De plus, comme le fichier .env Est simplement un magasin de valeurs-clés, les déclarations suivantes écraseraient les précédentes. Dans votre exemple, Laravel ne verrait jamais vos paramètres "locaux".

Cela semble étrange au début, mais ce nouveau système par défaut est en fait généralement plus facile et moins sujet aux problèmes que la "voie 4.2" avait/a, car il n’ya pas de place pour les erreurs de logique.

Si je n'ai pas de fichier .env, comment laravel saura quel environnement j'utilise?

Cela ne fonctionnerait pas du tout. Dans le fichier .env Se trouve également une déclaration APP_KEY, Qui Laravel ne fonctionnera pas sans. Sans un fichier .env, Vous obtiendrez un 500 erreur de serveur.

0
Shauna