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?
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:
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).
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";
Supprimer les modifications dans le fichier artisan.php
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.
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
Voici comment je l'ai configuré pour mes besoins.
Personnellement, j'ai besoin de 4 configurations différentes:
É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
});
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. :)
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...
}
Utilisez l’approche DotEnv détaillée dans les documents Laravel ici .
Nous utilisons la méthode recommandée par Jeffrey Way dans cette leçon Laracasts .
Créez des répertoires config
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 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';
}
);
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>'
]
]
]);
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()
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.
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é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