Paramètres de base de données liés à L'environnement dans Laravel?

je me déplace au-dessus du cadre de Laravel, mais j'ai des problèmes avec les paramètres de la base de données,

Précisément, j'ai mes environnements d'installation, et ils fonctionnent très bien pour l'application.fichier de configuration php, cependant la base de données.le fichier de configuration de php semble n'avoir aucun effet.

Même si j'ai une base de données.fichier de configuration php dans le dossier de mes environnements il n'est jamais chargé, j'ai mis un tas de caractères invalides (mash clavier) dans le fichier pour obtenir php pour jeter une erreur, mais il n'est jamais atteint.

est-ce que Laravel ne supporte pas les paramètres de bases de données basées sur l'environnement? ou suis-je en train de faire ce mal?

45
demandé sur Hailwood 2012-12-13 16:53:49

10 réponses

vous pouvez certainement définir les paramètres de base de données (et tout autre paramètre de configuration) par Environnement.

pour Laravel 3 (pour Laravel 4 et Laravel 5 Voir ci-dessous):

tout D'abord-vous devez définir $environments dans votre paths.php et le mettre à quelque chose comme ceci:

$environments = array(
  'development' => array('*.dev'),
  'production' => array('*.com'),
);

Laravel will automatiquement rechercher cette variable, et si elle est définie, configuration associée.

normalement vous avez un dossier config , avec des paramètres tels que database.php et auth.php

maintenant il suffit de créer un nouveau dossier pour chaque Laravel_Env que vous prévoyez d'utiliser (comme le développement). Vous finirez avec une structure de dossiers comme celle-ci;

/application
  /config
    /development
      database.php
    /production
      database.php
    application.php
    config.php
    database.php
    ...
    user_agents.php

vous remarquerez que j'ai seulement inclus database.php dans chaque sous-dossier. Laravel chargera toujours les paramètres de configuration par défaut en premier, puis les écraser avec tous les configs d'environnements de réglage.

enfin, dans votre fichier de développement / base de données, vous auriez quelque chose comme ceci;

<?php
 return array(
'default' => 'mysql'
 );

p. S. Je viens de le tester sur L'actuelle version 3.2.12 de Laravel - et cela fonctionne sans aucun doute.

Bonus Tip: vous pouvez également définir automatiquement un environnement pour Artisan, de sorte que vous ne devez pas inclure l'environnement manuellement sur chaque ligne de commande! Pour ce faire:

  1. Vous devez connaître votre "nom d'hôte" que vous exécutez Artisan. Pour le savoir - éditez temporairement le artisan.php dans votre dossier racine, et ajoutez var_dump(gethostname()); à la ligne 2 (i.e. au-dessus de tout).

  2. Exécuter php artisan à partir de la ligne de commande. Vous obtiendrez un saut de chaîne avec votre nom d'hôte. Dans mon cas, son "TSE-Win7";

  3. supprimer les changements au artisan.php fichier

  4. ajoutez votre nom d'hôte (i.e." TSE-Win7") aux environnements.

vous devriez finir avec quelque chose comme ça:

$environments = array(
  'development' => array('*.dev', 'TSE-Win7'),
  'production' => array('*.com'),
);

Artisan va maintenant fonctionner en utilisant votre environnement de développement. Si vous vous déployez sur un serveur en direct - relancez ces étapes pour obtenir le nom d'hôte() du serveur, et vous pouvez configurer une configuration artisan spécifique juste pour le serveur!

Pour Laravel 4:

L'environnement par défaut est toujours production . Mais dans votre .php fichier vous pouvez définir des environnements additionnels.

 $env = $app->detectEnvironment(array(
   'local' => array('your-machine-name'),
));

Sur Linux et Mac, vous pouvez déterminer votre hostname par type hostname dans votre terminal, il affichera le nom de votre ordinateur. Sur Windows a placé dd(gethostname()); au début de votre fichier routes.php - et exécuter le site Web une fois - il vous montrera le nom d'hôte actuel de votre ordinateur.

pour obtenir l'environnement actuel comme une variable dans votre application - lire cette réponse ainsi ici. Laravel 4: Comment obtenir la valeur environnementale?

Pour Laravel 5:

il y a fichier de configuration unique, appelé .env dans votre répertoire racine. Regardez ce laracast , config expliqué en détail.

64
répondu Laurence 2017-05-23 12:18:24

si vous utilisez l'artisan ( ligne de commande pour laravel ) toutes les commandes vous devez ajouter

artisan bla bla bla --env=Development 

ou

artisan bla bla bla --env=Production
8
répondu Knight 2012-12-15 14:02:22

montre comment je l'ai configuré pour mes besoins.

j'ai personnellement besoin de 4 configurations différentes:

  1. localhost (Mac OSX) - /Bibliothèque/WebServer/Documents/www/mon-domaine.com/développement/
  2. dev.my-domain.com (VPS)-/var/www / my-domain.com / development / 151980920"
  3. test.my-domain.com (VPS)-/var/www / my-domain.com / test /
  4. my-domain.com (VPS)-/var/www / my-domain.com / web/

étant donné que tous les 4 de mes environnements ont une structure de répertoire distinctive, je peux utiliser la constante magique de php __DIR__ pour récupérer le répertoire app et ensuite utiliser la fonction strpos () pour faire une simple vérification et retourner l'environnement approprié. Il prendra soin de L'environnement artisanal ainsi, pas besoin de taper manuellement l'environnement, ou d'ajouter des noms de machines.

dans le

bootstrap / start.151930920 php"

ajouter une fonction de rappel

$env = $app->detectEnvironment(function(){

  $haystack = __DIR__; // Catch the directory path

  // Set the booleans (remove the first '/', else strpos() will return 0)
  $isLocal       = strpos($haystack, 'Library/WebServer/Documents/www/my-domain.com/development/');
  $isDevelopment = strpos($haystack, 'var/www/my-domain.com/development/');
  $isTest        = strpos($haystack, 'var/www/my-domain.com/test/');
  $isProduction  = strpos($haystack, 'var/www/my-domain.com/web/');

  // Set the environments
  if ($isLocal)       $environment = "local";
  if ($isDevelopment) $environment = "development";
  if ($isTest)        $environment = "test";
  if ($isProduction)  $environment = "production";

  // Return the appropriate environment
  return $environment
});

une autre alternative

, Nous pouvons également définir et saisir toutes les valeurs à la fois dans un tableau, et d'exécuter une boucle foreach.

Conseil: puisque nous utilisons la fonction strpos () , qui vérifie la position de la première occurrence de la valeur donnée par rapport à la $haystack , et renvoie le numéro du poste. Nous n'avons pas vraiment besoin de fournir le chemin complet, nous pouvons simplement ajouter une valeur distinctive de chaque chemin pour obtenir le travail fait.

// Check the boolean, if true set to given value, else set NULL
$environments[] = strpos($haystack, "Library") ? 'local'      : NULL;
$environments[] = strpos($haystack, "develop") ? 'development': NULL;
$environments[] = strpos($haystack, "test")    ? 'test'       : NULL;
$environments[] = strpos($haystack, "web")     ? 'production' : NULL;

// Loop through each, if not null then we have our environment
foreach ($environments as $environment) {
     if(!is_null($environment))
     return $environment;
}

que nous travaillions sur une seule machine ou plusieurs, les chances d'avoir le même chemin vers des environnements différents sont très minces.

je crois. :)

4
répondu Faiyaz Haider 2014-02-07 05:45:08

configuration de l'environnement de la configuration spécifique est désormais officiel Laravel docs. Je recommande d'utiliser leur méthode au lieu de la réponse acceptée:

Il est souvent utile d'avoir différentes valeurs de configuration basé sur l'environnement dans lequel l'application se déroule. Par exemple, vous pouvez vous souhaitez utiliser un pilote de cache différent sur votre machine de développement local que sur le serveur de production. Il est facile d'accomplir ceci en utilisant configuration basée sur l'environnement.

créez simplement un dossier dans le répertoire de configuration qui correspond à votre nom de l'environnement, tels que local. Ensuite, créer les fichiers de configuration vous souhaitez outrepasser et spécifier les options pour cet environnement. Pour exemple, pour remplacer le gestionnaire de cache pour l'environnement local, vous serait de créer un cache.fichier php dans app / config / local avec le suivant contenu:

<?php    
return array(    
    'driver' => 'file',    
);

Note: Ne pas utiliser "testing" comme nom d'environnement. Ceci est réservé pour les tests unitaires. Notez que vous n'avez pas à spécifier toutes les options c'est dans le fichier de configuration de base, mais seulement les options que vous souhaitez remplacer. Les fichiers de configuration de l'environnement vont "passer en cascade" les fichiers de base.

ensuite, nous devons indiquer au cadre comment déterminer l'environnement, il est en cours d'exécution dans. L'environnement par défaut est toujours production. Cependant, vous pouvez configurer d'autres environnements bootstrap / start.fichier php à la racine de votre installation. Dans ce fichier vous trouverez un appel $app->detectenvironnement. Le tableau passé cette méthode est utilisée pour déterminer l'environnement actuel. Vous pouvez ajoutez d'autres environnements et noms de machines au tableau au besoin.

<?php

$env = $app->detectEnvironment(array(    
    'local' => array('your-machine-name'),    
));

dans cet exemple, "local" est le nom de l'environnement et 'votre-machine-nom" est le nom d'hôte de votre serveur. Sur Linux et Mac, vous pouvez déterminer votre nom d'hôte en utilisant la commande de terminal nom d'hôte.

si vous avez besoin de détection d'environnement plus flexible, vous pouvez passer un Fermeture à la méthode detectenvironnement, vous permettant de mettre en œuvre détection de l'environnement comme vous le souhaitez:

$env = $app->detectEnvironment(function()
{ 
    $domain = explode('.', $_SERVER['HTTP_HOST']);
    switch($domain[0])
    {
        case 'localhost':
        case 'localhost:8080':                
        case 'dev':
            return 'development';
            break;
        case 'mysite':
        default:
            return 'production';
            break;
    }
});

vous pouvez accéder à l'environnement d'application actuel via l'environnement méthode:

Accéder À L'Application Actuelle De L'Environnement

$environment = App::environment();

vous pouvez également passer des arguments à la méthode d'environnement pour vérifier si le l'environnement correspond à une valeur donnée:

if (App::environment('local'))
{
    // The environment is local
}

if (App::environment('local', 'staging'))
{
    // The environment is either local OR staging...
}
2
répondu Justin 2014-04-08 17:08:54

Laravel 5

utilisez l'approche DotEnv détaillée dans the Laravel docs here .

Laravel 4

nous utilisons la méthode Jeffrey Way recommandée dans cette leçon de Laracaste .

  • créer config répertoires pour chaque environnement .

    /app
        /config
            /local
                database.php
            /production
                database.php
    
  • définissez une variable d'environnement sur votre serveur de production. Google pour la meilleure approche sur votre plate-forme de production. Par exemple, voici de grandes suggestions pour Ubuntu , Dreamhost , et Heroku . Nous avons ajouté une ligne à /etc/environment :

    ENV=production
    
  • ajouter cette fermeture à /bootstrap/start.php . Avec cette configuration, toute serveur manquant la variable d'environnement ENV sera par défaut à la configuration d'environnement local .

    $env = $app->detectEnvironment(
        function () {
            return getenv('ENV') ? : 'local';
        }
    );
    
2
répondu Troy Harvey 2017-05-23 10:31:36

j'ai travaillé d'arrache-pied sur ce sujet aujourd'hui, luttant pour trouver la meilleure façon de faire des paramètres environnementaux pour une base de données. En fin de compte, après avoir essayé plusieurs méthodes, je suis entièrement d'accord avec @troy-harvey que la recommandation de Jeffrey Way de faire ceci est le meilleur (pour moi au moins). Une chose que je vais ajouter à cela, et c'est ce qui m'a tellement retenu aujourd'hui est ( et corrigez-moi si je me trompe ) que vous avez besoin d'accéder aux paramètres que vous essayez de dépasser dans votre environnement paramètres fichier par leurs clés de tableau correspondantes. J'ai commencé à retourner un tableau simple:

return [
    'database' => '<db_name>',
    'username' => '<db_user>',
    'password' => '<db_pass>',
]; 

dans un app/config/staging/database.php . Cela n'a eu aucun effet et après beaucoup de grattage de tête réalisé que vous devez accéder au réseau comme il est présenté dans app/config/database.php , comme ainsi:

<?php

return [
'connections' => [
    'mysql' => [
        'database' => '<db_name>',
        'username' => '<db_user>',
        'password' => '<db_pass>'
    ]
  ]
];

du moins, c'est comme ça que j'ai finalement réussi à obtenir mes réglages.

ajoutant ceci ici au cas où quelqu'un d'autre lutte pour travailler c'. En me rendant compte, j'ai compris à quel point je commettais une erreur évidente.

Révisé Le 01 Juillet 2014

un commentaire supplémentaire à ceci est que depuis le 4.1 Laravel bateaux avec une fonction d'aide appendic_config() pour ajouter des configurations environnementales au tableau de configuration principal.

cela ressemble à ceci pour l'exemple donné ci-dessus:

<?php

return append_config([
     'connections' => [
        'mysql' => [
             'database' => '<db_name>',
             'username' => '<db_user>',
             'password' => '<db_pass>'
        ]
      ]
   ]);

1
répondu Schneidey 2014-07-01 11:07:49

dans Laravel 3 pour détecter l'environnement il était:

Request:env()

qui retournerait tout ce qui a été identifié dans le tableau des environnements trouvés dans les chemins.fichier php.

comme déjà mentionné dans Laravel 4 il est maintenant:

App:: environment()
0
répondu Robert Brisita 2014-07-10 18:30:02

ma façon de le faire!

$env = $app->detectEnvironment( function() {
    if ( file_exists('../.env.local.php') ) {
        return 'local';
    }
    if ( file_exists('../.env.beta.php') ) {
        return 'beta';
    }
    return 'production';
} );
0
répondu Abi Xalmon 2014-09-23 13:28:06

Si vous essayez d'utiliser Laravel dans un environnement Windows, vérifier les paramètres dans le fichier .env dans le dossier de premier niveau de votre projet Laravel - ceux-ci supplanteront tous les paramètres de base de données que vous avez dans config/database.php

0
répondu Phil Pearce 2015-04-08 16:19:27

Si vous êtes sur Laravel 4 voici l'essentiel qui vous mènera à travers le processus étape par étape. Crédits à la réponse de @"The Shift Exchange" pour m'avoir guidé à le créer.

0
répondu TechyTimo 2015-08-20 14:19:28