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?
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']
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:
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 .(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)TestCase
, ce qui définit la variable APP_ENV
sur testing (via refreshApplication()
= - utilise putenv()
pour remplacer la valeur par défaut local
)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.
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.