45 votes

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

Je me déplace sur le framework Laravel, mais j'ai de la difficulté avec les paramètres de base de données,

Plus précisément, j'ai mes environnements d'installation, et ils fonctionnent très bien pour la application.php fichier de config, cependant la database.php fichier de configuration ne semble pas avoir d'effet.

Même si j'ai un database.php fichier de config dans mes environnements dossier, il n'est jamais chargé, j'ai mis un tas de caractères non valides (clavier mash) dans le fichier php de jeter une erreur, mais il n'est jamais atteint.

Ne Laravel pas en charge l'environnement, selon les paramètres de base de données? ou suis-je en train de faire ce mal?

64voto

The Shift Exchange Points 23103

Vous pouvez définir des paramètres de base de données (et de tout autre paramètre de configuration) par l'environnement.

Pour Laravel 3 (pour Laravel 4 voir ci-dessous):

D'abord, vous devez définir, $environments votre paths.php et le régler pour quelque chose comme ceci:

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

Laravel va automatiquement chercher cette variable, et si, va utiliser la configuration associée.

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

Maintenant, il suffit de créer un nouveau dossier pour chaque Laravel_Env vous prévoyez de l'utiliser (comme le Développement). Vous vous retrouverez avec une structure de dossier comme ceci;

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

Vous remarquerez que je n'ai inclus database.php dans chaque sous-dossier. Laravel toujours charger la configuration par défaut des paramètres d'abord, puis les écraser avec tous les configs d'environnements de réglage.

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

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

p.s. Je viens de tester cela sur l'actuel 3.2.12 construire de Laravel - et cela fonctionne bien.

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

  1. Vous avez besoin de connaître votre "nom d'hôte" que vous exécutez Artisan sur. Pour en savoir - modifier temporairement l' artisan.php dans votre dossier racine, et ajouter 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 une chaîne de vidage avec votre nom d'hôte. Dans mon cas, sa "TSE-Win7";

  3. Supprimer les modifications apportées à l' artisan.php le fichier

  4. Ajoutez votre nom d'hôte (c'est à dire "TSE-Win7") pour les environnements.

Vous devriez vous retrouver avec quelque chose comme ceci:

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

Artisan va maintenant exécuter à l'aide de votre environnement de développement. Si vous déployez un serveur live - ré-exécutez ces étapes pour obtenir le nom d'hôte() pour le serveur, et vous pouvez configurer un spécifique artisan config juste pour le serveur!

Pour Laravel 4:

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

 $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 mettre dd(gethostname()); au début de votre routes.php le fichier et exécutez le site web une fois, il va vous montrer l'actuel nom d'hôte de votre ordinateur.

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

8voto

Knight Points 316

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

 artisan bla bla bla --env=Development 
 

ou

 artisan bla bla bla --env=Production
 

4voto

Faiyaz Haider Points 31

Heres la façon dont je l'ai d'installation pour mes besoins.

Personnellement, j'ai 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/mon-domaine.com/développement/
  3. test.my-domain.com (VPS) - /var/www/mon-domaine.com/test/
  4. my-domain.com (VPS) - /var/www/mon-domaine.com/web/

Depuis tous les 4 de mes environnements distinctifs structure de répertoire, je peux utiliser le php est la magie de la constante __DIR__ pour aller chercher le répertoire app et ensuite utiliser le strpos() fonction pour effectuer une vérification simple et le retour à la appropriée de l'environnement. Il prendra soin de l'Artisan de l'environnement en tant que bien, pas besoin de taper manuellement l'environnement, ou ajouter des noms de machine.

À l'intérieur de la

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 d'exécuter une boucle foreach.

Astuce: Depuis que nous avons à l'aide de la strpos() fonction qui vérifie la position de la première occurrence de la valeur donnée à l'encontre de l' $botte de foin, et renvoie le numéro de position. Nous n'avons pas vraiment de fournir le chemin d'accès complet, il suffit d'ajouter un caractère distinctif de la valeur de chaque chemin pour faire le travail.

// 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;
}

Si l'on travaille sur une machine ou à plusieurs, les chances d'avoir le même chemin d'accès à différents environnements est très mince.

Ou alors, je pense. :)

2voto

Justin Points 2493

Configuration de l'environnement de configuration est maintenant officiel Laravel docs. Je vous conseille d'utiliser la méthode de leur choix au lieu de la accepté de répondre:

Il est souvent utile d'avoir différentes valeurs de configuration basé sur l'environnement de l'application est en cours d'exécution. Par exemple, vous pouvez souhaitez utiliser un autre gestionnaire de cache local sur votre machine de développement que sur le serveur de production. Il est facile de le faire à l'aide environnement, en fonction de la configuration.

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

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

Remarque: Ne pas utiliser de "testing" comme un nom de l'environnement. Ceci est réservé pour les tests unitaires. Notez que vous n'avez pas à spécifier toutes les options c'est dans la configuration de base du fichier, mais seulement les options que vous souhaitez pour remplacer. L'environnement de configuration les fichiers de la "cascade" sur les fichiers de base.

Ensuite, nous avons besoin de charger le cadre de la façon de déterminer ce qui l'environnement, il est en cours d'exécution. L'environnement par défaut est toujours de production. Cependant, vous pouvez l'installation d'autres environnements au sein de la bootstrap/start.php fichier à la racine de votre installation. Dans ce fichier, vous trouverez un $app->detectEnvironment appel. Le tableau passé cette méthode est utilisée pour déterminer le courant de l'environnement. Vous pouvez ajoutez d'autres environnements et les noms de machine pour le tableau en tant que de besoin.

<?php

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

Dans cet exemple, le "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 de domaine avec le nom de l'hôte terminal de commande.

Si vous avez besoin de plus souple, de détection, vous pouvez passer un Fermeture de la detectEnvironment méthode, vous permettant de mettre en œuvre environnement de détection toutefois 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'application actuelle de l'environnement via l'environnement méthode:

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

$environment = App::environment();

Vous pouvez également passer des arguments à l'environnement méthode pour vérifier si la 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...
}

2voto

Troy Harvey Points 613

Nous sommes à l'aide de la méthode de Jeffrey Manière recommandé dans ce Laracasts leçon.

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

    /app /config /local database.php /production database.php

  • Définir une variable d'environnement sur votre serveur de production. Google pour la meilleure approche sur votre plate-forme de production. Par exemple, voici des suggestions pour Ubuntu, Dreamhost, et Heroku. Nous avons ajouté une ligne unique pour /etc/environment:

    ENV=production

  • Ajouter cette fermeture d' /bootstrap/start.php. Avec cette configuration, un serveur quelconque manque l' ENV variable d'environnement par défaut à l' local environnement config.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X