web-dev-qa-db-fra.com

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

Je passe dans le framework Laravel, mais j'ai des problèmes avec les paramètres de la base de données,

Plus précisément, j'ai la configuration de mes environnements et ils fonctionnent bien pour le fichier de configuration application.php, mais le fichier de configuration database.php semble n'avoir aucun effet.

Même si j'ai un fichier de configuration database.php dans mon dossier d'environnements, il n'est jamais chargé, je mets un tas de caractères non valides (clavier mash) dans le fichier pour que php génère une erreur, mais elle n'est jamais touchée.

Laravel ne prend-il pas en charge les paramètres de base de données basés sur l’environnement? ou est-ce que je fais mal?

45
Hailwood

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

Premièrement, vous devez définir $environments dans votre paths.php et le définir comme suit:

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

Laravel cherchera automatiquement cette variable et, si elle est définie, utilisera la configuration associée.

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

Créez maintenant un nouveau dossier pour chaque Laravel_Env que vous prévoyez d’utiliser (par exemple, Développement). Vous allez vous retrouver avec une structure de dossier comme celle-ci;

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

Vous noterez que je n’ai inclus que database.php dans chaque sous-dossier. Laravel chargera toujours les paramètres de configuration par défaut en premier lieu, puis les remplacera par toute configuration personnalisée à partir du paramètre d'environnement.

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

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

p. Je viens de tester cela sur la version 3.2.12 actuelle de Laravel - et ça marche définitivement.} _

Bonus Astuce: Vous pouvez également définir automatiquement un environnement pour Artisan, de sorte que vous n'avez pas à inclure l'environnement manuellement sur chaque ligne de commande! Pour faire ça:

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

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

  3. Supprimer les modifications dans le fichier artisan.php

  4. Ajoutez votre nom d’hôte ("TSE-Win7") aux environnements.

Vous devriez vous retrouver avec quelque chose comme ça:

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

Artisan fonctionnera maintenant en utilisant votre environnement de développement. Si vous déployez sur un serveur actif, relancez ces étapes pour obtenir le nom d'hôte () du serveur et configurez une configuration artisanale spécifique pour le serveur!

Pour Laravel 4:

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

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

Sous Linux et Mac, vous pouvez déterminer votre hostname par type hostname dans votre terminal. Le nom de votre ordinateur sera alors affiché. Sous Windows, placez dd(gethostname()); au début de votre fichier routes.php - et exécutez le site Web une fois - il affichera le nom d'hôte actuel de votre ordinateur.

Pour obtenir l'environnement actuel en tant que variable dans votre application - lisez cette réponse SO ici. Laravel 4: comment puis-je obtenir la valeur de l'environnement?

Pour Laravel 5:

Il y a un seul fichier de configuration, appelé .env dans votre répertoire racine . Regardez ce laracast , explication complète de la configuration.

64
Laurence

si vous utilisez la commande artisan (ligne de commande pour laravel), vous devez ajouter chaque commande 

artisan bla bla bla --env=Development 

ou

artisan bla bla bla --env=Production
8
Knight

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

Personnellement, j'ai besoin de 4 configurations différentes:

  1. localhost (Mac OSX) - /Library/WebServer/Documents/www/my-domain.com/development/ 
  2. dev.my-domain.com (VPS) - /var/www/my-domain.com/development/
  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 mes 4 environnements ont une structure de répertoire distincte, je peux utiliser la constante magique _DIR_ de PHP pour récupérer le répertoire de l'application, puis utiliser la fonction strpos () pour effectuer une vérification simple et renvoyer l'environnement approprié. Il s’occupera également de l’environnement Artisan, il n’est pas nécessaire de saisir manuellement l’environnement ou d’ajouter des noms de machine.

À l'intérieur de 

bootstrap/start.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 exécuter une boucle foreach.

Astuce: Depuis que 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 de la position. Nous n'avons pas vraiment besoin de fournir l'intégralité du chemin, nous pouvons simplement ajouter une valeur distincte de chaque chemin pour que le travail soit effectué. 

// 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 ou plusieurs machines, les chances d’avoir le même chemin vers différents environnements sont très minces. 

Ou alors je pense. :)

4
Faiyaz Haider

Comment configurer une configuration spécifique à l'environnement est maintenant dans la documentation officielle de Laravel. Je recommanderais d'utiliser leur méthode à la place de la réponse acceptée:

Il est souvent utile d’avoir différentes valeurs de configuration basées sur l'environnement dans lequel l'application est exécutée. Par exemple, vous pouvez souhaitez utiliser un pilote de cache différent sur votre ordinateur de développement local que sur le serveur de production. Il est facile de réaliser cela en utilisant configuration basée sur l'environnement.

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

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

Remarque: n'utilisez pas 'testing' comme nom d'environnement. Ceci est réservé pour les tests unitaires. Notez qu'il n'est pas nécessaire de spécifier chaque option c'est dans le fichier de configuration de base, mais seulement les options que vous souhaitez pour remplacer. Les fichiers de configuration de l’environnement seront "mis en cascade" sur les fichiers de base.

Ensuite, nous devons indiquer au framework comment déterminer lequel environnement dans lequel il est exécuté. L’environnement par défaut est toujours production. Cependant, vous pouvez configurer d’autres environnements au sein du fichier Fichier bootstrap/start.php à la racine de votre installation. Dans ce vous trouverez un appel $ app-> detectEnvironment. Le tableau a passé Cette méthode est utilisée pour déterminer l’environnement actuel. Tu peux ajoutez d'autres environnements et noms de machines à la baie selon vos besoins.

<?php

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

Dans cet exemple, "local" est le nom de l'environnement et 'votre-nom-machine' est le nom d'hôte de votre serveur. Sous Linux et Mac, vous pouvez déterminer votre nom d'hôte à l'aide de la commande hostname terminal.

Si vous avez besoin d’une détection d’environnement plus souple, vous pouvez passer un Fermeture de la méthode detectEnvironment, vous permettant d'implémenter 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'environnement d'application actuel

$environment = App::environment();

Vous pouvez également passer des arguments à la méthode d'environnement pour vérifier si le fichier 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
Justin

Laravel 5

Utilisez l’approche DotEnv détaillée dans les documents Laravel ici .

Laravel 4

Nous utilisons la méthode recommandée par Jeffrey Way dans cette leçon Laracasts .

  • Créez des répertoires configpour 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 plateforme de production. Par exemple, voici d'excellentes suggestions pour Ubuntu , Dreamhost et Heroku . Nous avons ajouté une seule ligne à /etc/environment:

    ENV=production
    
  • Ajoutez cette fermeture à /bootstrap/start.php. Avec cette configuration, tout serveur ne disposant pas de la variable d’environnement ENV adoptera par défaut la configuration local environment.

    $env = $app->detectEnvironment(
        function () {
            return getenv('ENV') ? : 'local';
        }
    );
    
2
Troy Harvey

Je travaille sur ce sujet aujourd'hui, en essayant de trouver le meilleur moyen de créer des paramètres environnementaux pour une base de données. En fin de compte, après avoir essayé plusieurs méthodes, je suis tout à fait d’accord avec @ troy-harvey pour dire que la recommandation de Jeffrey Way de faire cela est la meilleure (pour moi du moins). Une chose que je vais ajouter à cela, et c’est ce qui m’a le plus préoccupée aujourd’hui, c’est ( et corrigez-moi si je me trompe ) que vous devez accéder aux paramètres que vous essayez de remplacer par vos paramètres environnementaux. fichier par leurs clés de tableau correspondantes. J'ai commencé par 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 de nombreuses critiques, il est apparu que vous deviez accéder au tableau tel qu'il est présenté dans app/config/database.php, comme ceci:

<?php

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

Au moins, c’est ainsi que j’ai finalement réussi à récupérer mes paramètres. 

Ajouter ceci ici au cas où quelqu'un d'autre aurait du mal à résoudre ce problème. En réalisant, j'ai compris à quel point mon erreur était évidente. 

Edité le 01 juillet 2014

Un commentaire supplémentaire à cela est que, depuis la version 4.1, Laravel est livré avec une fonction d’aide append_config () permettant d’ajouter des configurations environnementales au tableau de configuration principal. 

Cela ressemblerait à ceci pour l'exemple donné ci-dessus:

<?php

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

1
Schneidey

Dans Laravel 3 pour détecter l’environnement, c’était:

Request:env()

Ce qui renverrait tout ce qui a été identifié dans le tableau d'environnements trouvé dans le fichier paths.php.

Comme mentionné précédemment dans Laravel 4, il est maintenant:

App:: environment()
0
Robert Brisita

Si vous êtes sur Laravel 4 voici un Gist qui vous guidera pas à pas dans le processus. Crédits à la réponse de @ "The Shift Exchange" pour me guider dans sa création.

0
TechyTimo

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
Abi Xalmon

Si vous essayez d'utiliser Laravel dans un environnement Windows, vérifiez les paramètres du fichier .env du dossier de niveau supérieur de votre projet Laravel. Ils remplaceront tous les paramètres de base de données que vous avez dans config/database.php

0
Phil Pearce