web-dev-qa-db-fra.com

Laravel 5 configuration - environnements et dépassement

J'ai installé une nouvelle copie Laravel 5.

Ma fonction detectEnvironment est définie comme suit:

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

Dans config\local j'ai créé le fichier database.php:

<?php

return [
    'nothing' => 'new',
];

Je lance php artisan clear-compiled.

Ma méthode index de WelcomeController est définie comme suit:

public function index(Application $app)
{
    echo $app->environment();
    var_dump($app['config']['database']);
    //echo $app['config']['database'];
    return view('welcome');
}

L'application a été importée de cette manière: use Illuminate\Foundation\Application;

Le résultat obtenu est:

local array(1) { ["nothing"]=> string(3) "new" } 

alors que je m'attendrais à ce que Laravel cascade le fichier de configuration avec le fichier de production (avec le fichier config\database.php par défaut).

La chose étrange est que même si je commente la ligne return 'local';, lancez à nouveau php artisan clear-compiled:

production array(1) { ["nothing"]=> string(3) "new" } 

il semble donc qu'il charge toujours le contenu du fichier database.php (celui-ci du dossier local) et remplace le fichier database.php principal. Cela fonctionne à nouveau lorsque je change ce nom de fichier en par exemple aaa.php.

Est-ce un bug ou peut-être que la configuration de l'environnement ne devrait pas être stockée dans le répertoire config? Mais sinon, où devraient-ils être stockés? Je ne sais pas si c'est un bug ou une fonctionnalité, donc si quelqu'un en sait plus à ce sujet, donnez-moi s'il vous plaît un indice.

12
Marcin Nabiałek

Bien que la documentation de Laravel dev (5.0) contienne des informations indiquant que la configuration en cascade n’est pas vraie. Je l'ai testé il y a environ 2 semaines et il semble que pour le moment, le seul moyen d'avoir des valeurs différentes pour les environnements consiste à utiliser un fichier ENV dans lequel vous définissez des valeurs personnalisées pour l'environnement actuel. Mettre les paramètres dans les répertoires ne fonctionnera pas comme avant, mais il est possible que cela change ou a peut-être déjà été changé depuis 2 semaines.

13
Marcin Nabiałek

Il existe un package qui ramène le système de configuration en cascade à Laravel 5. 

Disclaimer: je suis l'auteur. 

7
An Phan

Pour moi, cela ressemble à un défaut de la branche Laravel 5 dev. J'ai pu contourner le problème en ajoutant la détection et la configuration manuelle de l'environnement. Ce code le fait.

'default' => $app->environment()=='testing'?'sqlite':'mysql',
3
Margus Pala

Il est facile de configurer l’environnement Laravel 5. 

  1. Ouvrez votre dossier d’application racine et recherchez ".env.example",
  2. Copier et renommer ".env",
  3. Veuillez insérer le fichier ".env" dans votre environnement,
  4. Si vous utilisez GIT, assurez-vous de ne pas envoyer ce fichier dans votre référentiel GIT. Pour 'une explication complète', j’écris cette configuration ici .

Édité;

Je cite le développeur dans son fichier readme.md du référentiel github;

phpdotenv est conçu pour les environnements de développement et ne devrait généralement pas être utilisé. en production. En production, les variables d'environnement réelles Doivent être définies de manière à éviter toute surcharge de chargement du fichier .Env à chaque demande. Cela peut être réalisé via un processus de déploiement automatisé Avec des outils tels que Vagrant, chef ou Puppet, ou peut être Défini manuellement avec des hôtes cloud comme Pagodabox et Heroku.

Donc, vous devez créer un fichier ".env" par machine et ne pas utiliser le fichier ".env" sur votre serveur de production.

0
user3851143