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?
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:
-
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 ajoutezvar_dump(gethostname());
à la ligne 2 (i.e. au-dessus de tout). -
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"; -
supprimer les changements au
artisan.php
fichier -
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.
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
montre comment je l'ai configuré pour mes besoins.
j'ai personnellement besoin de 4 configurations différentes:
- localhost (Mac OSX) - /Bibliothèque/WebServer/Documents/www/mon-domaine.com/développement/
- dev.my-domain.com (VPS)-/var/www / my-domain.com / development / 151980920"
- test.my-domain.com (VPS)-/var/www / my-domain.com / test /
- 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. :)
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...
}
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'environnementENV
sera par défaut à la configuration d'environnementlocal
.$env = $app->detectEnvironment( function () { return getenv('ENV') ? : 'local'; } );
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>'
]
]
]);
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()
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';
} );
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
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.