php - poner - Configuración de base de datos impulsada por el entorno en Laravel?
migraciones laravel (10)
Laravel 5
Use el enfoque DotEnv detallado en los documentos de Laravel aquí .
Laravel 4
Estamos utilizando el método recomendado por Jeffrey Way en esta lección de Laracasts .
Crea directorios de
config
para cada entorno ./app /config /local database.php /production database.php
Establezca una variable de entorno en su servidor de producción. Busque el mejor enfoque en su plataforma de producción. Por ejemplo, aquí hay grandes sugerencias para Ubuntu , Dreamhost y Heroku . Agregamos una sola línea a
/etc/environment
:ENV=production
Agregue este cierre a
/bootstrap/start.php
. Con esta configuración, cualquier servidor que no tenga la variable de entornoENV
se establecerá de forma predeterminada en la configuración del entornolocal
.$env = $app->detectEnvironment( function () { return getenv(''ENV'') ? : ''local''; } );
Me estoy moviendo sobre el marco de Laravel, pero estoy teniendo problemas con la configuración de la base de datos,
Específicamente, tengo la configuración de mis entornos, y están funcionando bien para el archivo de configuración application.php, sin embargo, el archivo de configuración database.php parece no tener ningún efecto.
Incluso si tengo un archivo de configuración database.php en mi carpeta de entornos nunca se carga, pongo un montón de caracteres no válidos (mash de teclado) en el archivo para que php arroje un error, pero nunca se golpea.
¿Laravel no es compatible con la configuración de base de datos basada en el entorno? o estoy haciendo esto mal?
¡Mi forma de hacerlo!
$env = $app->detectEnvironment( function() {
if ( file_exists(''../.env.local.php'') ) {
return ''local'';
}
if ( file_exists(''../.env.beta.php'') ) {
return ''beta'';
}
return ''production'';
} );
Definitivamente puede establecer la configuración de la base de datos (y cualquier otra configuración) por medio del entorno.
Para Laravel 3 (para Laravel 4 y Laravel 5 ver a continuación):
En primer lugar, necesita definir $environments
en su paths.php
y configurarlo de la siguiente manera:
$environments = array(
''development'' => array(''*.dev''),
''production'' => array(''*.com''),
);
Laravel buscará automáticamente esta variable, y si está configurada, usará la configuración asociada.
Normalmente tiene una carpeta de config
, con configuraciones tales como database.php
y auth.php
Ahora solo crea una nueva carpeta para cada Laravel_Env
que planeas usar (como Desarrollo). Terminará con una estructura de carpetas como esta;
/application
/config
/development
database.php
/production
database.php
application.php
config.php
database.php
...
user_agents.php
Notarás que solo he incluido database.php
en cada subcarpeta. Laravel siempre cargará primero la configuración de configuración predeterminada y luego la anulará con cualquier configuración personalizada desde la configuración de entornos.
Finalmente, en su archivo de desarrollo / base de datos, tendría algo como esto;
<?php
return array(
''default'' => ''mysql''
);
PD: Acabo de probar esto en la versión 3.2.12 actual de Laravel, y definitivamente funciona.
Sugerencia de bonificación: también puede establecer automáticamente un entorno para Artisan, por lo que no tiene que incluir el entorno manualmente en cada línea de comando. Para hacer esto:
Necesitas saber tu ''nombre de host'' en el que estás ejecutando Artisan. Para averiguarlo, edite el
artisan.php
temporalmente en su carpeta raíz y agreguevar_dump(gethostname());
a la línea 2 (es decir, por encima de todo).Ejecute
php artisan
desde la línea de comando. Obtendrá un volcado de cadena con su nombre de host. En mi caso es "TSE-Win7";Elimine los cambios en el archivo
artisan.php
Agregue su nombre de host (es decir, "TSE-Win7") a los entornos.
Deberías terminar con algo como esto:
$environments = array(
''development'' => array(''*.dev'', ''TSE-Win7''),
''production'' => array(''*.com''),
);
Artisan ahora se ejecutará utilizando su entorno de desarrollo. Si implementa en un servidor en vivo, vuelva a ejecutar estos pasos para obtener el nombre de host () para el servidor, y puede configurar una configuración artesanal específica solo para el servidor.
Para Laravel 4:
El entorno predeterminado es siempre production
. Pero en su archivo start.php puede definir entornos adicionales.
$env = $app->detectEnvironment(array(
''local'' => array(''your-machine-name''),
));
En Linux y Mac, puede determinar su hostname
de hostname
por tipo de hostname
de hostname
en su terminal: dará como resultado el nombre de su computadora. En Windows ponga dd(gethostname());
al comienzo de su archivo routes.php
, y ejecute el sitio web una vez, le mostrará el nombre de host actual de su computadora.
Para obtener el entorno actual como una variable en su aplicación , lea esta respuesta SO aquí. Laravel 4: ¿cómo puedo obtener el valor del medio ambiente?
Para Laravel 5:
Hay un archivo de configuración único, llamado .env
en su directorio raíz. Mira este laracast , config explicado completamente.
En Laravel 3 para detectar el entorno, fue:
Request:env()
Lo cual devolvería lo que se identificó en la matriz de entornos encontrada en el archivo paths.php.
Como se mencionó anteriormente en Laravel 4, ahora es:
App:: environment()
He estado trabajando en esto hoy, luchando por encontrar la mejor manera de hacer ajustes ambientales para una base de datos. Al final, después de probar varios métodos, estoy totalmente de acuerdo con @ troy-harvey en que la recomendación de Jeffrey Way de hacer esto es la mejor (al menos para mí). Una cosa que añadiré a esto, y es lo que me detuvo tanto hoy es ( y corríjame si me equivoco ) que necesita acceder a la configuración que está tratando de anular en su archivo de configuración ambiental por su correspondiente teclas de matriz Empecé devolviendo una matriz simple:
return [
''database'' => ''<db_name>'',
''username'' => ''<db_user>'',
''password'' => ''<db_pass>'',
];
dentro de una app/config/staging/database.php
. Esto no tuvo ningún efecto y después de mucho scratching se dio cuenta de que necesita acceder a la matriz tal como se presenta en app/config/database.php
, así:
<?php
return [
''connections'' => [
''mysql'' => [
''database'' => ''<db_name>'',
''username'' => ''<db_user>'',
''password'' => ''<db_pass>''
]
]
];
Al menos así es como finalmente logré que mi configuración se recogiera.
Agregando esto aquí en caso de que alguien más esté luchando para resolver esto. Al darme cuenta entendí cuán obvio era un error que estaba cometiendo.
Editado 01 de julio de 2014
Un comentario adicional a esto es que 4.1 Laravel se envía con una función de ayuda append_config () para anexar configuraciones ambientales a la matriz de configuración principal.
Esto se vería así para el ejemplo anterior:
<?php
return append_config([
''connections'' => [
''mysql'' => [
''database'' => ''<db_name>'',
''username'' => ''<db_user>'',
''password'' => ''<db_pass>''
]
]
]);
Heres cómo lo tengo configurado para mis necesidades.
Personalmente necesito 4 configuraciones diferentes:
- localhost (Mac OSX) - /Library/WebServer/Documents/www/my-domain.com/development/
- dev.my-domain.com (VPS) - /var/www/my-domain.com/development/
- test.my-domain.com (VPS) - /var/www/my-domain.com/test/
- my-domain.com (VPS) - /var/www/my-domain.com/web/
Dado que los 4 de mis entornos tienen una estructura de directorio distintiva, puedo usar la constante mágica de php __DIR__ para buscar el directorio de la aplicación y luego usar la función strpos () para hacer una simple comprobación y devolver el entorno apropiado. También se ocupará del entorno Artisan, sin necesidad de escribir manualmente el entorno ni agregar ningún nombre de máquina.
Dentro de
bootstrap / start.php
Agregar una función de devolución de llamada
$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
});
Otra alternativa
También podemos establecer y tomar todos los valores a la vez en una matriz, y ejecutar un bucle foreach.
Consejo: Ya que usamos la función strpos () , que verifica la posición de la primera ocurrencia del valor dado contra $ haystack , y devuelve el número de posición. Realmente no tenemos que suministrar toda la ruta, simplemente podemos agregar un valor distintivo de cada ruta para hacer el trabajo.
// 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;
}
Ya sea que trabajemos en una sola máquina o en varias, las posibilidades de tener la misma ruta a diferentes entornos son muy escasas.
O eso creo. :)
Si está en Laravel 4, aquí hay una esencia que lo guiará paso a paso en el proceso. Créditos a la respuesta de @ "The Shift Exchange" por guiarme a crearlo.
Si está intentando usar Laravel en un entorno Windows, consulte las configuraciones en el archivo .env en la carpeta de nivel superior para su proyecto Laravel; esto anulará las configuraciones de base de datos que tenga en config / database.php.
si está utilizando el artesano (línea de comando para laravel) cada comando que necesita agregar
artisan bla bla bla --env=Development
o
artisan bla bla bla --env=Production
Cómo configurar la configuración específica del entorno ahora está en los documentos oficiales de Laravel. Yo recomendaría usar su método en lugar de la respuesta aceptada:
A menudo es útil tener diferentes valores de configuración basados en el entorno en el que se ejecuta la aplicación. Por ejemplo, puede desear usar un controlador de caché diferente en su máquina de desarrollo local que en el servidor de producción. Es fácil lograr esto usando una configuración basada en el entorno.
Simplemente cree una carpeta dentro del directorio de configuración que coincida con el nombre de su entorno, como local. A continuación, cree los archivos de configuración que desea anular y especifique las opciones para ese entorno. Por ejemplo, para anular el controlador de caché para el entorno local, crearía un archivo cache.php en la aplicación / config / local con el siguiente contenido:
<?php
return array(
''driver'' => ''file'',
);
Nota: No use ''testing'' como nombre de entorno. Esto está reservado para pruebas unitarias. Tenga en cuenta que no tiene que especificar todas las opciones que se encuentran en el archivo de configuración base, sino solo las opciones que desea anular. Los archivos de configuración del entorno "en cascada" sobre los archivos base.
A continuación, debemos indicarle al marco cómo determinar en qué entorno se está ejecutando. El entorno predeterminado siempre es de producción. Sin embargo, puede configurar otros entornos dentro del archivo bootstrap / start.php en la raíz de su instalación. En este archivo, encontrará una llamada $ app-> detectEnvironment. La matriz pasada a este método se usa para determinar el entorno actual. Puede agregar otros entornos y nombres de máquinas a la matriz según sea necesario.
<?php
$env = $app->detectEnvironment(array(
''local'' => array(''your-machine-name''),
));
En este ejemplo, ''local'' es el nombre del entorno y ''your-machine-name'' es el nombre de host de su servidor. En Linux y Mac, puede determinar su nombre de host utilizando el comando de terminal de nombre de host.
Si necesita una detección de entorno más flexible, puede pasar un Cierre al método detectEnvironment, lo que le permite implementar la detección del entorno como lo desee:
$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;
}
});
Puede acceder al entorno de aplicación actual a través del método de entorno:
Accediendo al entorno de aplicación actual
$environment = App::environment();
También puede pasar argumentos al método de entorno para verificar si el entorno coincide con un valor dado:
if (App::environment(''local''))
{
// The environment is local
}
if (App::environment(''local'', ''staging''))
{
// The environment is either local OR staging...
}